zoukankan      html  css  js  c++  java
  • java reflection总结

    一、java反射常用方法

            获取Class的几种方式:

            Class class1 = String.class;// 该方法最为安全可靠,程序性能更高。
            Class class2 = string.getClass();
            Class class3 = Class.forName("java.lang.String");// 可能抛出ClassNotFoundException异常

            Class class = Integer.TYPE;//不能用第一种方式

            获取内部类:

            getDeclaredClasses()

            获取本类中声明的字段:

            getDeclaredFields()

            getDeclaredField(String name)

            获取本类中声明的方法:

            getDeclaredMethods()

            getDeclaredMethod(String name, Class...<?> parameterTypes)

            获取本类中声明的构造函数

            getDeclaredConstructors()

            getDeclaredConstructor(Class...<?> parameterTypes)

            通过反射设置字段属性(还有方法来获取,get(Object object))

            set(Object object, Object value)

            通过反射调用方法(也可以获取方法的一些其他属性)

            invoke(Object receiver, Object... args)

            通过反射生成对象(也可以获取构造函数的一些其他属性)

            newInstance(Object... args)

    二、Java Annotation

            请参考http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html

            这部分在代码注释中去理解。


    三、改变字段(域)的值

            Field.java

    import java.lang.reflect.*;  
    public class Field2 { 
       public double d;  
       public static void main(String args[]) { 
          try { 
               Class cls = Class.forName("Field2"); 
               Field fld = cls.getField("d"); 
               Field2 f2obj = new Field2(); 
               System.out.println("d = " + f2obj.d); 
               fld.setDouble(f2obj, 12.34); 
               System.out.println("d = " + f2obj.d); 
          } 
          catch (Throwable e) { 
               System.err.println(e); 
          } 
       } 
    } 


            输出结果:

            


    四、根据方法的名称来执行方法

            Method2.java

    import java.lang.reflect.*; 
    public class Method2 { 
       public int add(int a, int b) { 
          return a + b; 
       } 
       public static void main(String args[]) { 
          try { 
               Class cls = Class.forName("Method2"); 
               //Class partypes[] = new Class[2]; 
               //partypes[0] = Integer.TYPE; 
               //partypes[1] = Integer.TYPE; 
           
               Method meth = cls.getMethod("add", new Class[]{Integer.TYPE,Integer.TYPE}); 
               Method2 methobj = new Method2(); 
               //Object arglist[] = new Object[2]; 
               //arglist[0] = new Integer(37); 
               //arglist[1] = new Integer(47); 
               Object retobj = meth.invoke(methobj, new Object[]{new Integer(37),new Integer(47)}); 
               Integer retval = (Integer) retobj; 
               System.out.println(retval.intValue()); 
          } 
          catch (Throwable e) { 
               System.err.println(e); 
          } 
       } 
    }


    五、创建新的对象

           Constructor2.java

              

    import java.lang.reflect.*;  
    public class Constructor2 { 
       public Constructor2() { 
       }  
       public Constructor2(int a, int b) { 
          System.out.println("a = " + a + " b = " + b); 
       }  
       public static void main(String args[]) { 
          try { 
               Class cls = Class.forName("Constructor2"); 
               //Class partypes[] = new Class[2]; 
               //partypes[0] = Integer.TYPE; 
               //partypes[1] = Integer.TYPE; 
               Constructor ct = cls.getConstructor(new Class[]{Integer.TYPE,Integer.TYPE}); 
               //Object arglist[] = new Object[2]; 
               //arglist[0] = new Integer(37); 
               //arglist[1] = new Integer(47); 
               Object retobj = ct.newInstance(new Object[]{new Integer(37),new Integer(47)}); 
          } 
          catch (Throwable e) { 
               System.err.println(e); 
          } 
       } 
    } 



           

  • 相关阅读:
    Sales Portal遇到问题及解决
    LYOA 遇到的问题及解决方案
    ERS遇到的问题及solution
    ehr遇到问题及解决方法
    dropdownlist中的Checkbox,可控制是否postback
    javascirpt
    【spring boot】idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到(转)
    SpringBoot2.1整合finereport10(帆软报表)
    Windows下MyCat配置MySql读写分离
    Windows下MySQL主从同步
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3285790.html
Copyright © 2011-2022 走看看