Java-反射机制

定义

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
————百度百科

加载方式

Class对象有三种获取方法:
  1. XXX.class
  2. Object.getClass()
  3. Class.forName()

详细使用方法见实例,注释得很详细哟~

实例

  1 import java.lang.reflect.Constructor;
  2 import java.lang.reflect.Field;
  3 import java.lang.reflect.Method;
  4 
  5 class User{
  6     private int id;
  7     private String name;
  8     
  9     //无参
 10     public User(){
 11         this.id=-1;
 12         this.name="null";
 13     }
 14     
 15     //有参
 16     public User(int id,String name) {
 17         this.id=id;
 18         this.name=name;
 19     }
 20     public int getId() {
 21         return id;
 22     }
 23     public void setId(int id) {
 24         this.id = id;
 25     }
 26     public String getName() {
 27         return name;
 28     }
 29     public void setName(String name) {
 30         this.name = name;
 31     }
 32     @Override
 33     public String toString() {
 34         return "[id=" + id + ", name=" + name + "]";
 35     }
 36     public void hello() {
 37         System.out.println("hello world");
 38     }
 39     private void sing(String song) {
 40         System.out.println("sing "+song+"...");
 41     }
 42 }
 43 
 44 public class Test {
 45 
 46     public static void main(String[] args) throws Exception {
 47         // TODO Auto-generated method stub
 48         User user=new User(0, "les");  //创建测试类
 49         //Class对象有三种获取方法
 50         //===1===
 51         Class class1=User.class;
 52         //===2===
 53         Class class2=user.getClass();
 54         //===3===
 55         Class class3=Class.forName("testForReflection.User");   //包名+类名
 56         //反射机制的功能
 57         //===1===创建实例对象
 58         //无参
 59         User user2=(User) class3.newInstance();
 60         System.out.println("user2"+user2);
 61         //有参
 62         Constructor constructor=class3.getConstructor(int.class,String.class);   //获取有参构造函数
 63         User user3=(User) constructor.newInstance(1,"cc");   //通过构造函数创建实例
 64         System.out.println("user3"+user3);
 65         //===2===获取全部构造函数
 66         Constructor[] constructors=class3.getConstructors();
 67         System.out.println("User构造函数的个数:"+constructors.length);
 68         for(int i=0;i<constructors.length;i++) {
 69             System.out.print(" NO"+i+":");
 70             Class[] parameterTypes=constructors[i].getParameterTypes();
 71             if(parameterTypes.length==0) {
 72                 System.out.print("无参 ");
 73             }else {
 74                 for(int j=0;j<parameterTypes.length;j++) {
 75                     System.out.print(parameterTypes[j].getName()+" ");
 76                 }
 77             }
 78         }
 79         System.out.println("");
 80         //===3===获取成员变量
 81         Field field=class2.getDeclaredField("id");
 82         field.setAccessible(true);   //id为private,将其设为可见
 83         System.out.println("id修改前:"+field.getInt(user));
 84         field.setInt(user, 1);
 85         System.out.println("id修改后:"+field.getInt(user));
 86         //===4===获取全部成员变量
 87         Field[] fields=class2.getDeclaredFields();
 88         System.out.println("User参数个数:"+fields.length);
 89         for(int i=0;i<fields.length;i++) {
 90             fields[i].setAccessible(true);
 91             System.out.println(fields[i].getName()+":"+fields[i].get(user));
 92         }
 93         //===5===获取方法
 94         Method method=class1.getMethod("hello");
 95         method.invoke(user);
 96         Method method2=class1.getDeclaredMethod("sing", String.class);
 97         method2.setAccessible(true);  //打开私有方法权限
 98         method2.invoke(user, "倩女幽魂");
 99         //===6===获取所有方法
100         Method[] methods=class1.getDeclaredMethods();
101         //===7===获取所有接口
102         Class[] interfaces=class1.getInterfaces();
103         
104     }
105 
106 }
View Code

参考链接

posted @ 2019-05-06 13:52  极地饮冰  阅读(193)  评论(0编辑  收藏  举报