zoukankan      html  css  js  c++  java
  • 反射

    方法介绍 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
  • 相关阅读:
    使用dbms_metadata.get_ddl遇到ORA-31603
    oracle得到建表语句
    Linux性能优化和监控系列(一)——top工具
    Oracle在Linux下的性能优化
    地址跳转问题
    无法对 数据库'UDS' 执行 删除,因为它正用于复制
    [.net 多线程]SpinWait
    [.net 多线程 ]ReaderWriterLock
    [.net 多线程]Barrier
    [.net 多线程]CountdownEvent
  • 原文地址:https://www.cnblogs.com/xumin/p/3142826.html
Copyright © 2011-2022 走看看