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