java的反射


JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

  


1
package com.www.invoke; 2 3 import java.lang.reflect.Method; 4 5 /** 6 * 通过反射操作 类的方法 7 * java的反射 是说的是运行时 。 8 * 反射的总结: 9 * 1,每个类都有与之对用的Class对象。 10 * 2,每个方法都有与之对用的Method对象。 11 * 3,每个成员变量都有与之对用的Field对象。 12 * 4,第一步都是获得类对应的Class对象。 13 * 5,通过反射可以获得私有的成员变量和方法。 14 * @author Kelly.chen 15 * 16 */ 17 public class InvokeTest { 18 19 public int add(int a, int b){ 20 return a + b; 21 } 22 23 public String getName(String name){ 24 return "My name is "+name; 25 } 26 27 public static void main(String[] args) throws Exception { 28 //获得类对应的的Class对象 方法一 29 //Class<?> classType = InvokeTest.class; 30 //获得类对应的Class对象 方法二 31 Class<?> classType = Class.forName("com.www.invoke.InvokeTest"); 32 //获得InvokeTest 的一个对象 相当于 InvokeTest invokeTest = new InvokeTest(); 33 Object invokeTest = classType.newInstance(); 34 //测试是不是 InvokeTest的对象 结果是 ture 35 System.out.println(invokeTest instanceof InvokeTest); 36 37 //获得 add() 方法 38 //第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数对应 39 Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); 40 41 System.out.println(addMethod.getName()); 42 //调用方法 43 //第一个参数是那个对象的方法,第二个参数是Object类型的可变参数,与方法参数对应 44 Object object = addMethod.invoke(invokeTest, new Object[]{2, 3}); 45 46 System.out.println(object); 47 48 //获得getName()方法 49 Method getNameMethod = classType.getMethod("getName", new Class[]{String.class}); 50 //调用getName()方法 51 Object objectName = getNameMethod.invoke(invokeTest, new Object[]{"chenlei"}); 52 System.out.println(objectName); 53 //得到所有public 方法(包括继承父类的方法) 54 Method[] methods = classType.getMethods(); 55 for (Method method : methods) { 56 System.out.println(method.getName());//获得方法的名字 57 } 58 } 59 }

 获得私有方法和成员变量

 1 package com.www.invoke;
 2 
 3 import java.lang.reflect.Field;
 4 import java.lang.reflect.Method;
 5 
 6 public class PrivateTest {
 7     
 8     private String address="shanghai";
 9     
10     public int age = 20;
11     
12     protected String school = "北京大学";
13     
14     private String sayHello(String name){
15         
16         return "Hello :"+name;
17     }
18     public static void main(String[] args) throws Exception {
19 
20         Class<?> classType = PrivateTest.class;
21         PrivateTest privateTest = (PrivateTest) classType.newInstance();
22         //可以获得私有的方法,第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数类型对应
23         Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class });
24         //true不再进行访问权限检查,之后就可以访问此私有方法了,false与之相反
25         method.setAccessible(true); 
26         //调用方法
27         Object object = method.invoke(privateTest, new Object[] { "chenlei" });
28         System.out.println(object);
29         /* -----------------------------调用 成员变量-----------------------*/
30         //只能获得public 修饰的方法的成员变量
31         Field ageField = classType.getField("age"); 
32         //获得变量的值
33         int age = ageField.getInt(privateTest);
34         System.out.println(age);
35         Field addressField = classType.getDeclaredField("address");
36         //true不再进行访问权限检查,之后就可以访问此私有变量了
37         addressField.setAccessible(true);
38         //获得变量的值
39         String address = (String) addressField.get(privateTest);
40         System.out.println(address);
41         //获得所有public修饰的成员变量
42         Field[] fields = classType.getFields();
43         for (Field field : fields) {
44             System.out.println(field);
45         }
46     }
47 }

总结:

java的反射 是说的是运行时 。
反射的总结:
1,每个类都有与之对用的Class对象。
2,每个方法都有与之对用的Method对象。
3,每个成员变量都有与之对用的Field对象。
4,第一步都是获得类对应的Class对象。
5,通过反射可以获得私有的成员变量和方法。

  

原文地址:https://www.cnblogs.com/c9999/p/6068459.html