黑马程序员—反射
2015-07-22 18:02
489 查看
------- android培训、java培训、期待与您交流! ----------
反射就是把java类中的各种成分映射成相应的java类.
java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class
在java中,Object类是所有类的父类,同样,所有类的实例化对象也都是Class类的实例
Person p=new Person();
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
Class类的实例化
由于Class类没有构造方法,所以实例化Class类的方式有点特殊,有三种方式:
对象.getClass( )
类.Class
forName( )
获取字节码对象的3种方式
一.Object类中的getClass()方法,要有明确的类,并创建对象
Person p=new Person();
Class clazz=p.getClass();
二.通过类
Class clazz=Person.class();
三.通过给定的类的字符串名称
Class clazz=Class.forName("cn.itcast.bean.Person");
这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、package
Class类中有一个方法叫做newInstance( ),它可以用来创建一个Class类对象的新实例
怎么说呢?Class对象包含的内容就是反射好的那个类,我们要构造那个类的新实例(新对象)
获取Class中的构造函数
一.(Person p=new Person();)
String name="cn.itcast.bean.Person";
Class clazz=Class.foeName(name);找寻该文件类文件,并加载进内存,并产生Class对象
Object obj=clazz.newInstance();产生该类对象,调用Person的空参构造函数
二.(Person p=new Person("李华",29);)
String name="cn.itcast.bean.Person";
Class clazz=Class.foeName(name);
Constructor con=clazz.getConstructor(String.class,int.class);获取到了指定的构造函数对象
Object obj=con.newInstance("李华",29);
构造方法需要使用getConstructor( )方法获得
至于参数类型则是:原有类型.class
获取Class中的字段
(Person p=new Person("李华",29);)
Class clazz = Class.forName("cn.itcast.bean.Person");
Field field = claszz.getField("age");getField只能获取所有可访问公共字段,private获取不到。
String str=(String)field.get(p);get(p)表明要获取是哪个对象的值
System.out.println("年龄:"+str);
Field field = clazz.getDeclaredField("age");getDeclaredField可以获取到公共字段,也可以获取到私有字段。
field.setAccessible(true);对私有字段的访问取消权限检查,暴力访问。
Object obj = clazz.newInstance();
field.set(obj,89);为对象的属性赋值
Object o = field.get(obj); 获取某对象的某属性值
System.out.println(field);
获取Class中的方法
一.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method[] methods=clazz.getMethods();获取的都是公有方法
methods=clazz.getDeclaredMethods();只获取本类中所有方法,包括私有
for(Method me:methods)
{
System.out.println(me);
}
二.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("show",null);//获取空参数一般方法
Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(int.class,String.class);
obj = constructor.newInstance(37,"小明");
method.invoke(obj,null);
三.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("paramMethod",String.class,int.class);//获取空参数一般方法
Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor();
obj = constructor.newInstance();
method.invoke(obj,"小强",89);
反射应用
![](http://images0.cnblogs.com/blog2015/778241/201507/251736407182448.png)
![](http://images0.cnblogs.com/blog2015/778241/201507/251737122815239.png)
![](http://images0.cnblogs.com/blog2015/778241/201507/251745176091936.png)
反射就是把java类中的各种成分映射成相应的java类.
java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class
Class类
如果要完成反射,那么必须了解Class类在java中,Object类是所有类的父类,同样,所有类的实例化对象也都是Class类的实例
Person p=new Person();
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
Class类的实例化
由于Class类没有构造方法,所以实例化Class类的方式有点特殊,有三种方式:
对象.getClass( )
类.Class
forName( )
获取字节码对象的3种方式
一.Object类中的getClass()方法,要有明确的类,并创建对象
Person p=new Person();
Class clazz=p.getClass();
二.通过类
Class clazz=Person.class();
三.通过给定的类的字符串名称
Class clazz=Class.forName("cn.itcast.bean.Person");
Class类的应用
表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息。这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、package
Class类中有一个方法叫做newInstance( ),它可以用来创建一个Class类对象的新实例
怎么说呢?Class对象包含的内容就是反射好的那个类,我们要构造那个类的新实例(新对象)
获取Class中的构造函数
一.(Person p=new Person();)
String name="cn.itcast.bean.Person";
Class clazz=Class.foeName(name);找寻该文件类文件,并加载进内存,并产生Class对象
Object obj=clazz.newInstance();产生该类对象,调用Person的空参构造函数
二.(Person p=new Person("李华",29);)
String name="cn.itcast.bean.Person";
Class clazz=Class.foeName(name);
Constructor con=clazz.getConstructor(String.class,int.class);获取到了指定的构造函数对象
Object obj=con.newInstance("李华",29);
构造方法需要使用getConstructor( )方法获得
至于参数类型则是:原有类型.class
获取Class中的字段
(Person p=new Person("李华",29);)
Class clazz = Class.forName("cn.itcast.bean.Person");
Field field = claszz.getField("age");getField只能获取所有可访问公共字段,private获取不到。
String str=(String)field.get(p);get(p)表明要获取是哪个对象的值
System.out.println("年龄:"+str);
Field field = clazz.getDeclaredField("age");getDeclaredField可以获取到公共字段,也可以获取到私有字段。
field.setAccessible(true);对私有字段的访问取消权限检查,暴力访问。
Object obj = clazz.newInstance();
field.set(obj,89);为对象的属性赋值
Object o = field.get(obj); 获取某对象的某属性值
System.out.println(field);
获取Class中的方法
一.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method[] methods=clazz.getMethods();获取的都是公有方法
methods=clazz.getDeclaredMethods();只获取本类中所有方法,包括私有
for(Method me:methods)
{
System.out.println(me);
}
二.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("show",null);//获取空参数一般方法
Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(int.class,String.class);
obj = constructor.newInstance(37,"小明");
method.invoke(obj,null);
三.
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("paramMethod",String.class,int.class);//获取空参数一般方法
Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor();
obj = constructor.newInstance();
method.invoke(obj,"小强",89);
反射应用
![](http://images0.cnblogs.com/blog2015/778241/201507/251736407182448.png)
![](http://images0.cnblogs.com/blog2015/778241/201507/251737122815239.png)
![](http://images0.cnblogs.com/blog2015/778241/201507/251745176091936.png)
![](http://images0.cnblogs.com/blog2015/778241/201507/251745320781682.png)
相关文章推荐
- 面试题1——等长数组及45度
- 程序员后花园
- 程序员编程之道之快乐编程好习惯
- 关于数组与指针的一个面试题
- IT职场,你如何规划的更好?
- 黑马程序员————Java基础日常笔记---IO其他流
- 假如你喜欢一个程序员小伙
- 阿里巴巴常考面试题及汇总答案
- 知乎奇文!程序员风格的修真小说
- Java程序员常犯的五个错误
- 黑马程序员--IO流
- 阿里前端电话面试
- 给“夜猫子”程序员的科学熬夜指南
- Web前端开发工程师--面试要求
- 如何锻炼出最牛程序员的编码套路
- 前端开发面试知识点大纲
- 程序员必须知道的10大基础算法及讲解
- 2015年网易考拉海淘android面试
- 黑马程序员——第一篇_面向对象
- 一次面试引发的思考(中小型网站优化思考) (转)