反射

方法介绍 http://www.cnblogs.com/mengdd/archive/2012/08/18/2645553.html

1 成员方法的反射(Object a):

Method method=a.getClass().getMethod(方法名称,方法参数); //new Class[]{JSONObject.class} ("main",new Class[]{String[].class});

int kk=(Integer) method.invoke(object, new Object[] {j});

备注 :枚举类 都有一个name()方法

2 公有成员变量的获取

        Field fieldIsDelay=msgType.getClass().getField("isDelay");
        boolean isDelay=(Boolean) fieldIsDelay.get(msgType);

3 私有成员变量的暴力获取

        Field fieldIsDelay=msgType.getClass().getDeclaredField("isDelay");
        fieldIsDelay.setAccessible(true);//暴力反射
        boolean isDelay=(Boolean) fieldIsDelay.get(msgType);

 4 Class.forName()与ClassLoader.loadClass的区别

//通过类装载器获取Car类对象  

ClassLoader loader = Thread.currentThread().getContextClassLoader();   

Class clazz = loader.loadClass("com.baobaotao.reflect.Car"); //只装载类,没初始化

Class.forName("XXX.XXX", true, CALLCLASS.class.getClassLoader()); 第二次参数表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量。

UserReflec.java

  1 package com.loginSystem.test;
  2 import java.lang.reflect.Array;
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Method;
  6 import org.junit.Test;
  7 import com.loginSystem.domain.User;
  8 public class UserReflect {
  9     @Test
 10     public void classlei() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
 11 /*        User user=new User();
 12         Class<? extends User> cls=user.getClass();
 13         System.out.println(User.class);
 14         try {
 15             System.out.println(Class.forName(cls.getName())==cls);
 16         } catch (ClassNotFoundException e) {
 17             e.printStackTrace();
 18         }
 19         System.out.println(user.getClass());    
 20         cls.isPrimitive();
 21         cls.isArray();*/
 22         ClassLoader loader = Thread.currentThread().getContextClassLoader();   
 23         Class<?> clazz = loader.loadClass("com.loginSystem.domain.User");   
 24         System.out.println("ddddddddddd1");
 25         Class.forName("com.loginSystem.test.UserReflect", false, User.class.getClassLoader());
 26         System.out.println("ddddddddddd2");
 27         Class<?> cls=Class.forName("com.loginSystem.domain.User");
 28         System.out.println(clazz);
 29         System.out.println(cls);
 30     }
 31     
 32     //@Test
 33     public void ref() throws Exception{
 34         User user=new User();
 35         //1无参,带参构造函数
 36         Class<? extends User> cls=user.getClass();
 37         cls.newInstance();
 38         
 39         Constructor<? extends User> cons=user.getClass().getConstructor(int.class,String.class,String.class);
 40         Object o=cons.newInstance(3,"user","123");
 41         System.out.println(o.getClass().getName());
 42 
 43         //2获得指定Field的值
 44         Field creditsF=cls.getField("credits");
 45         int credits=(Integer) creditsF.get(o);
 46         System.out.println("credits="+credits);
 47         
 48         Field nameF=cls.getDeclaredField("userName");
 49         nameF.setAccessible(true);
 50         String name=(String) nameF.get(o);
 51         System.out.println("name="+name);
 52         
 53         //3给指定Field赋值
 54         nameF.set(o, "xumin");
 55         System.out.println(nameF.get(o));
 56         
 57         //4获取所有Field名与值
 58         Field []fields=cls.getDeclaredFields();
 59         for(Field f:fields){
 60             f.setAccessible(true);
 61             boolean b=f.isAccessible();
 62             f.get(o);
 63             System.out.println(b+":"+f+" = "+f.get(o));
 64         }
 65         
 66         Field []fs=cls.getFields();
 67         for(Field f:fs){
 68             f.get(o);
 69             System.out.println(f+" = "+f.get(o));
 70         }    
 71     }
 72     
 73     //@Test
 74     public void methodFlect() throws Exception{
 75         //定义一个对象
 76         User user=new User();
 77         Class<? extends User> cls=user.getClass();
 78         Object o=cls.getConstructor(int.class,String.class,String.class).newInstance(5,"xx","123");
 79          //1调用一个方法
 80         Method m=cls.getMethod("credit", int.class,int.class);
 81         Object[] zhi1=(Object[]) m.invoke(o, 3,5);
 82         System.out.println(zhi1.length);
 83         for(Object a:zhi1){
 84             System.out.println(a);
 85         }
 86         //2处理数组
 87         Object zhi2=(Object[])m.invoke(o, 5,5);
 88         if(zhi2.getClass().isArray()){
 89             //方法1 获得数组里每个值
 90             Object[] zhi3=(Object[]) zhi2;
 91             for(Object a:zhi3){
 92                 System.out.println(a.getClass());
 93             }
 94             //方法2 获得数组里每个值
 95             for(int i=0;i<Array.getLength(zhi2);i++){
 96                 System.out.println(Array.get(zhi2, i));
 97             }
 98         }
 99     
100     }
101 }

User.java

 1 package com.loginSystem.domain;
 2 
 3 import net.sf.json.JSONObject;
 4 
 5 public class User {
 6     static{
 7         password="1111";    
 8         System.out.println("静态代码块运行");
 9         }
10     private String userName;
11     static private String password;
12     public int credits;
13     
14     public String getUserName() {
15         return userName;
16     }
17     public void setUserName(String userName) {
18         this.userName = userName;
19     }
20     public String getPassword() {
21         return password;
22     }
23     public void setPassword(String password) {
24         User.password = password;
25     }
26     public int getCredits() {
27         return credits;
28     }
29     public void setCredits(int credits) {
30         this.credits = credits;
31     }
32     public User(){
33         credits=10;
34         userName="name";
35             
36         System.out.println("instance***************");
37         System.out.println("credits="+credits+";userName="+userName+";password="+password);
38     }
39     
40     public User(int a,String b,String c){
41         credits=a;
42         userName=b;
43         password=c;        
44         System.out.println("credits="+credits+";userName="+userName+";password="+password);
45     }
46     
47     public String[] credit(int q,int m){
48         System.out.println("credit****************");
49         if(q==3){
50             System.out.println("3****************");
51             return new String[]{"a3","b3","c3"};
52         }
53         else{
54             System.out.println(q+"****************");
55             return new String[]{"a3","b6","c9"};
56         }
57     }
58     
59     public JSONObject jsonName(JSONObject a){
60         a.put("xumin", "111");
61         return a;
62     }
63 }
View Code
原文地址:https://www.cnblogs.com/xumin/p/3142826.html