巩固java(七)-----java反射机制
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。【这段话摘自百度百科】
java反射有这些功能:
* 在运行时判断一个对象所属的类;
* 在运行时构造任意一个类的对象;
* 在运行时判断任意一个类的成员对象和方法;
* 在运行时调用任意一个类的方法
* 生成动态代理
接下来,将通过一些实例理解java的反射机制。
根据对象获取其完整的包名和类名
abstract class Base{
}
class BaseExt extends Base{
}
public class Reflection {
public static void main(String[] args) {
BaseExt baseExt = new BaseExt();
//通过对象获得其完整的包名和类名
System.out.println("baseExt对象的运行时类的java.lang.Class对象:"+baseExt.getClass());
System.out.println("实例化出对象baseExt的类为:"+baseExt.getClass().getName());
System.out.println("实例化出对象baseExt的类的超类为:"+baseExt.getClass().getSuperclass().getName());
System.out.println("实例化出对象baseExt的类的超类的超类为:"+baseExt.getClass().getSuperclass().getSuperclass().getName());
}
}
运行结果
baseExt对象的运行时类的java.lang.Class对象:class reflection.BaseExt
实例化出对象baseExt的类为:reflection.BaseExt
实例化出对象baseExt的类的超类为:reflection.Base
实例化出对象baseExt的类的超类的超类为:java.lang.Object
归纳:
1.getClass()的作用是返回该对象的运行时类的java.lang.Class对象;
2.getSuperclass()的作用是返回对象的类的父类的java.lang.Class对象;
3.getName()的作用是根据class获取它的包名和路径;
实例化类的对象,获取类的属性和方法,调用类的方法
class Base1{
public int count;
public void say(String item){
System.out.println("我是Base1类,"+item);
}
public void tell(){
System.out.println("我是不会告诉你我是Base1的");
}
}
class Base2{
public String name;
public void say(String item){
System.out.println("我是Base2类,"+item);
}
public void tell(){
System.out.println("我是不会告诉你我是Base2的");
}
}
class Info{
public void getInfo(Object obj){
//获取obj对象的类名
String className = obj.getClass().getName();
try {
//实例化一个类className的对象
Class<?> base = Class.forName(className);
//获得该类的所有属性
Field[] fields = base.getDeclaredFields();
System.out.println("fields:");
for(Field field:fields){
//访问修饰符
int mo = field.getModifiers();
String modifier = Modifier.toString(mo);
//属性类型
String type = field.getType().getName();
//属性名
String name = field.getName();
System.out.println(" "+modifier + " "+ type + " " +name);
}
//获得该类的所有方法
Method[] methods = base.getMethods();
System.out.println("methods:");
for(Method method:methods){
//访问修饰符
int mmo = method.getModifiers();
String mmodifier = Modifier.toString(mmo);
//返回类型
String mtype = method.getReturnType().getName();
//属性名
String mname = method.getName();
System.out.println(" "+mmodifier + " "+ mtype + " " +mname);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void say(Object obj,String item){
//获取obj对象的类名
String className = obj.getClass().getName();
try{
//实例化一个类className的对象
Class<?> base = Class.forName(className);
//调用base对象所属类的say方法
Method method = base.getMethod("say",String.class);
method.invoke(base.newInstance(),item);
//调用base对象所属类的tell方法
Method method2 = base.getMethod("tell");
method2.invoke(base.newInstance());
}catch(Exception e){
e.printStackTrace();
}
}
}
public class Reflection {
public static void main(String[] args) {
Info info = new Info();
info.getInfo(new Base1());
System.out.println("-------------------------");
info.getInfo(new Base2());
System.out.println("-------------------------");
info.say(new Base1(),"你是谁?");
System.out.println("-------------------------");
info.say(new Base2(),"你是谁?");
}
}
运行结果:
fields:
public int count
methods:
public void say
public void tell
public final void wait
public final void wait
public final native void wait
public boolean equals
public java.lang.String toString
public native int hashCode
public final native java.lang.Class getClass
public final native void notify
public final native void notifyAll
-------------------------
fields:
public java.lang.String name
methods:
public void say
public void tell
public final void wait
public final void wait
public final native void wait
public boolean equals
public java.lang.String toString
public native int hashCode
public final native java.lang.Class getClass
public final native void notify
public final native void notifyAll
-------------------------
我是Base1类,你是谁?
我是不会告诉你我是Base1的
-------------------------
我是Base2类,你是谁?
我是不会告诉你我是Base2的
归纳:
4.Class<?> base = Class.forName(className) 通过调用Class.forName()实例化一个类的对象;
5.getDeclaredFields()获取该类的属性,getMethods()获取该类的方法,getModifiers获取属性和方法的访问修饰符等;
6.通过Info类中say方法的写法调用类的方法,getMethod方法的第一个参数为方法名,后面是参数类型,无参方法只写方法名即可,invoke方法从第二个参数开始为被调用方法的参数
另外通过阅读java API我们还可以获取到其他的一些方法,比如获取构造方法,获取方法参数等等。
好了,反射暂时先写到这里。
版权声明:本文为博主原创文章,未经博主允许不得转载。
巩固java(七)-----java反射机制的更多相关文章
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 黑马程序员——【Java高新技术】——反射机制
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...
- java基础篇---反射机制
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- java进阶(41)--反射机制
文档目录: 一.反射机制的作用 二.反射机制相关类 三.获取class的三种方式 四.通过反射实例化对象 五.通过读属性文件实例化对象 六.通过反射机制访问对象属性 七.通过反射机制调用方法 ---- ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Java 中的反射机制
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- JAVA类型信息——反射机制
JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
随机推荐
- PS 图像调整算法——黑白
这个算法是参考自 阿发伯 的博客: http://blog.csdn.net/maozefa 黑白调整 Photoshop CS的图像黑白调整功能,是通过对红.黄.绿.青.蓝和洋红等6种颜色的比例调节 ...
- cocoa编程第4版 8.5 挑战1 解答
看似简单,其实也很简单,但开始思路想错了:还上网查了一下,有网友说是将Array Controller的Keys中的personName改为personName.length,好像完全不起作用. 后来 ...
- FineReport性能调优的一些办法
FineReport性能调优的基本思路,就要对应用服务器的内存大小进行合理的设置. 一般服务器默认的内存配置都比较小,在较大型的应用项目中,这点内存是不够的,因此需要加工使其调大. 各应用服务器的内存 ...
- SharePoint 调查添加图片支持
前言:今天,碰到一个有趣的问题,就是SharePoint调查里面,添加对于图片的支持,众所周知,SharePoint的调查就支持那么几种字段类型的问题,当然,我们可以开发实现,不过,这个不是我们今天介 ...
- 面试之路(4)-TCP/IP/HTTP概述
tcp/ip基础知识 TCP/IP全称是Transmission Control Protocol/Internet Protocol. IP地址共32位,4字节. IP地址分为两部分:网络标识和主机 ...
- 为何我会喜欢封闭的apple?
原来本猫喜欢的手机是简单的塞班系统,nokia的E72i,超经典吧!就是最近都有把它充满电重新拿出来用的冲动呀.可惜无奈的是上面的应用太少呀!原来PC和笔记本装的是各种清一色的windows系统,从3 ...
- ruby中如何调用与局部变量同名的私有方法
如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器 ...
- Spring Cloud 入门教程 - 搭建配置中心服务
简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...
- 前端到docker入门
Docker的诞生 我们总是会遇到测试对开发说项目又不work了,开发总说:在我电脑上是ok的阿. 项目组加了新人,我们就需要教新人配置各种开发环境,每换一台机器就要配置一次,每来一个新人就要配置一次 ...
- 两个Web应用必须的Servlet Filter
其实原文是一个英文文章“Two Servlet Filters Every Web Application Should Have” 文章说了2个Filter: GzipFilter ChcheFil ...