黑马程序员----反射

来源:互联网 发布:mac网盘下载速度慢 编辑:程序博客网 时间:2024/05/23 18:10


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!

1.Class

       .class文件加载到内存中就是一个Class对象

       获取Class对象的方式有3种:

       Scanner sc = newScanner("xxx.txt");

           Class.forName(sc.nextLine());

           类名.class

           对象.getClass()

[java] view plaincopy
  1. import cn.itcast.bean.Person;  
  2.   
  3. public class Demo1_Reflect {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      * @throws ClassNotFoundException  
  8.      */  
  9.     public static void main(String[] args) throws ClassNotFoundException {  
  10.         Class<?> clazz1 = Class.forName("cn.itcast.bean.Person");  
  11.         Class<?> clazz2 = Person.class;  
  12.           
  13.         Person p = new Person();  
  14.         Class<?> clazz3 = p.getClass();  
  15.           
  16.         System.out.println(clazz1 == clazz2);  
  17.         System.out.println(clazz2 == clazz3);  
  18.     }  
  19.   
  20. }  

2.Constructor

       Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了

       可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数

       然后再调用Constructor类的newInstance("张三",20)方法创建对象

[java] view plaincopy
  1. import java.lang.reflect.Constructor;  
  2.   
  3. import cn.itcast.bean.Person;  
  4.   
  5. public class Demo3_Constructor {  
  6.   
  7.     /* 
  8.       @throws Exception  
  9.      */  
  10.     public static void main(String[] args) throws Exception {  
  11.         Class<?> clazz = Class.forName("cn.itcast.bean.Person");  
  12.         /*Person p = (Person) clazz.newInstance(); 
  13.         System.out.println(p);*/  
  14.         Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数  
  15.         Person p = (Person) con.newInstance("张三",23);                   //创建对象  
  16.         System.out.println(p);                                          //打印对象  
  17.     }  
  18.   
  19. }  

3.Field

       Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取

       通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限

       用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

[java] view plaincopy
  1. import java.lang.reflect.Constructor;  
  2. import java.lang.reflect.Field;  
  3.   
  4. import cn.itcast.bean.Person;  
  5.   
  6. public class Demo4_Field {  
  7.   
  8.       
  9.       
  10.     public static void main(String[] args) throws Exception {  
  11.         Class<?> clazz = Class.forName("cn.itcast.bean.Person");  
  12.         Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数  
  13.         Person p = (Person) con.newInstance("张三",23);                   //创建对象  
  14.           
  15.         /*Field f = clazz.getField("name"); 
  16.         System.out.println(f);*/  
  17.         Field f = clazz.getDeclaredField("name");                       //暴力反射  
  18.         f.setAccessible(true);                                          //去除权限  
  19.         f.set(p, "李四");  
  20.         System.out.println(p);  
  21.     }  

4.Method

       Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法

       调用invoke(Object,Object...)可以调用该方法

       Class.getMethod("eat")invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)

[java] view plaincopy
  1. import java.lang.reflect.Constructor;  
  2. import java.lang.reflect.Method;  
  3.   
  4. import cn.itcast.bean.Person;  
  5.   
  6. public class Demo5_Method {  
  7.   
  8.     /** 
  9.      *4.Method 
  10.         Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法 
  11.         调用invoke(Object, Object...)可以调用该方法 
  12.         Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10) 
  13.      * @throws Exception  
  14.      */  
  15.     public static void main(String[] args) throws Exception {  
  16.         Class<?> clazz = Class.forName("cn.itcast.bean.Person");  
  17.         Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数  
  18.         Person p = (Person) con.newInstance("张三",23);                   //创建对象  
  19.           
  20.         Method m = clazz.getMethod("eat");  
  21.         m.invoke(p);  
  22.           
  23.         Method m2 = clazz.getMethod("eat"int.class);  
  24.         m2.invoke(p, 10);  
  25.     }  
  26. }  

 

0 0