java反射机制
2015-10-02 11:08
260 查看
java反射机制:
java反射机制是在运行状态中,对于任意一个类(class 文件),都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用他的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
动态获取类中的信息,就是java反射。可以理解为对类的解剖
用于描述字节码文件的类 class Class{ },这个类中提供了获取字节码文件中内容的方法
要想对字节码文件进行解剖,必须要有字节码文件
如何获取字节码文件对象,有三种方式:
1、Object类中的getClass( )方法的。
想要用这种方式,必须要明确具体的类,并创建对象,麻烦
例如:Person p = new Person( ); Class clazz = p.getClass;
2、任何数据类型都具备一个静态的属性。class来获取其对应的class对象
相对简单,但是还是要明确到类中的静态成员,还是不够扩展
Class clazz =Person.class();
3(重点)、只要通过给定的类的字符串名称就可以获取该类,更为扩展
可以用Class类中的方法完成,该方法就是forName
这种方式只要有名称就可以,更为方便,扩展性更强
String className =“cn.itcast.bean.Person”;注意:要有完整的包名
Class clazz = Class.forName(className);
(1)、获取构造函数
newInstance();创建此class对象所表示的类的一个新实例
一般被反射的类都带有空参的构造函数,没有空参构造函数时要怎么做呢?
getConstructors(可变参数);获得类中的公共构造函数,只能是公共的
例如:Constructor constructor = clazz.getConstructors(String.class,int.class);
//通过该构造器的newInstance方法进行对象的初始化
Object obj = constructor.newInstance("小明",38);
getDeclaredConstructors获取类中所有的构造函数,包括私有构造函数,但只是本类中的
(2)、获取字段
Field field = clazz.getDeclaredField("age");
//对私有字段的访问取消权限检查.暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj,89);
Object o = field.get(obj);
(3)、获取方法
Methods [] methods = clazz.getMethods();//获取所有的公共方法
methods = clazz.DeclaredgetMethods();
for(Method method:method){
System.out.println(method);
}
Method method = clazz.getMethod("show",null);//获取一个空参数的函数名为show的方法,第二个参 数是可变参数
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小明",38);
mehtod.invoke(obj,null);
java反射机制是在运行状态中,对于任意一个类(class 文件),都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用他的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
动态获取类中的信息,就是java反射。可以理解为对类的解剖
用于描述字节码文件的类 class Class{ },这个类中提供了获取字节码文件中内容的方法
要想对字节码文件进行解剖,必须要有字节码文件
如何获取字节码文件对象,有三种方式:
1、Object类中的getClass( )方法的。
想要用这种方式,必须要明确具体的类,并创建对象,麻烦
例如:Person p = new Person( ); Class clazz = p.getClass;
2、任何数据类型都具备一个静态的属性。class来获取其对应的class对象
相对简单,但是还是要明确到类中的静态成员,还是不够扩展
Class clazz =Person.class();
3(重点)、只要通过给定的类的字符串名称就可以获取该类,更为扩展
可以用Class类中的方法完成,该方法就是forName
这种方式只要有名称就可以,更为方便,扩展性更强
String className =“cn.itcast.bean.Person”;注意:要有完整的包名
Class clazz = Class.forName(className);
(1)、获取构造函数
newInstance();创建此class对象所表示的类的一个新实例
一般被反射的类都带有空参的构造函数,没有空参构造函数时要怎么做呢?
getConstructors(可变参数);获得类中的公共构造函数,只能是公共的
例如:Constructor constructor = clazz.getConstructors(String.class,int.class);
//通过该构造器的newInstance方法进行对象的初始化
Object obj = constructor.newInstance("小明",38);
getDeclaredConstructors获取类中所有的构造函数,包括私有构造函数,但只是本类中的
(2)、获取字段
Field field = clazz.getDeclaredField("age");
//对私有字段的访问取消权限检查.暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj,89);
Object o = field.get(obj);
(3)、获取方法
Methods [] methods = clazz.getMethods();//获取所有的公共方法
methods = clazz.DeclaredgetMethods();
for(Method method:method){
System.out.println(method);
}
Method method = clazz.getMethod("show",null);//获取一个空参数的函数名为show的方法,第二个参 数是可变参数
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小明",38);
mehtod.invoke(obj,null);
相关文章推荐
- 判断闰年的Java算法
- Pointcut is not well-formed: expecting 'name pattern' at character position
- Java简单MP3播放器
- Java基础知识强化之集合框架笔记18:List集合特有的ListIterator迭代器
- Struts2 级联数据传递
- HDU 1715 大菲波数 (java)
- Struts2 获取表单请求参数
- Java虚拟机类加载机制
- java.lang.Exception: 索引中丢失 IN 或 OUT 参数::2 解决方法
- Pre-bound JDBC Connection found!解决办法
- eclipse黑底背景的设置
- java设计模式--单例模式
- HDOJ 1753 大明A+B (高精度的小数加法 java )
- JAVA阶段以及收银系统项目总结
- JAVA阶段以及收银系统项目总结
- 开启Java之路——不走弯路,就是捷径,欲速则不达
- spring源码
- java中的继承和接口
- Java中Runnable和Thread的区别
- Java基础知识强化之集合框架笔记17:List集合的特有的遍历功能