反射机制

来源:互联网 发布:国资委党员网络培训 编辑:程序博客网 时间:2024/05/18 16:13

反射

             作用:程序可以动态获取其本身定义的类、方法、字段等

               应用领域:多数作为程序框架使用,常见为代码+配置文件结构等   


相关类包

  • java.lang.reflect.AccessibleObject
    • java.lang.reflect.Constructor<T>
    • java.lang.reflect.Field
    • java.lang.reflect.Method



获取类方法

常用的获取类对象的三种方法(常用Class.forName()来获取到类对象)


  核心方法



     定义Person类

 package org.nihaoi.fan; public class Person {   //Person类的全地址名为 org.nihaoi.fan.Person   //.... }

测试程序

        @org.junit.Testpublic void test1() throws Exception{//1. 使用Class类的静态方法forName获取类对象    参数为:类的全地址名Class clazz = Class.forName("org.nihaoi.fan.Person");//2. 通过对象获取Person p = new Person();Class clazz0 = p.getClass();//3. 通过给定类名获取Class clazz1 = Person.class;System.out.println(clazz.getName());System.out.println(clazz0.getName());System.out.println(clazz1.getName());}


输出结果
   org.nihaoi.fan.Person   org.nihaoi.fan.Person   org.nihaoi.fan.Person

依据上述例子, 在配置文件中只需要给出对应类的全地址名,就可以通过发射机制获取到这个类。

这样设计会增强程序的适用性






获取类中的构造器

现在不仅要获取类对象,同时还要用获取到的Person类来实例化Person类的对象,此时如果Person中没有重写构造器,那只需要调用类对象的newInstance()方法即可。如果Person本身提供了多个构造器,那就需要先获取其构造器。


核心方法

  对于public构造器 使用getConstructor即可

        对于private构造器 使用getDeclaredConstructor获取





改写Person类

public class Person {public String secret ="handsome";public Person(){   System.out.println("person constructer null");}public Person(String name,int age){    System.out.println("person constructer name:"+name+",age:"+age);}private Person(String name,String des){              System.out.println("person private constructer :"+name+" is "+des);}}


测试程序
@org.junit.Test    public void test1() throws Exception{     //获取类对象 Class clazz = Class.forName("org.nihaoi.fan.Person");  //获取构造器(无参构造器)    Constructor c0 = clazz.getConstructor();     Object o0 = c0.newInstance();  //使用构造器的newInstance方法实例化对象       //获取构造器(两个参数)          Constructor c1 = clazz.getConstructor(String.class,int.class);          Object o1 = c1.newInstance("fan",21);        //获取pirvate构造器         Constructor c2 = clazz.getDeclaredConstructor(String.class,String.class);         c2.setAccessible(true);  //做权限强改         Object o2 = c2.newInstance("fan","man");  }


测试结果

person constructer nullperson constructer name:fan,age:21person private constructer :fan is man





获取到类的方法

对于public方法使用getMethod即可

对于private方法需要使用getDeclaredMethod方法,使用需要修改access属性

  




修改Person类

public class Person {public String secret ="handsome";public void eat(){System.out.println("person eat");}public String eat(String what){System.out.println("person eat:"+what);return "I what double:"+what+".";}private void drink(String what){System.out.println("person private method drink:"+what);}public static void drink(){System.out.println("person static method drink:");}}


测试程序

@org.junit.Testpublic void test1() throws Exception{//获取类对象Class clazz = Class.forName("org.nihaoi.fan.Person");//获取无参方法Method method0 = clazz.getMethod("eat", null);method0.invoke(clazz.newInstance(), null);//获取带参方法Method method1 = clazz.getMethod("eat", String.class);method1.invoke(clazz.newInstance(), "apple");//获取private带参方法Method method2 = clazz.getDeclaredMethod("drink", String.class);method2.setAccessible(true);method2.invoke(clazz.newInstance(), "water");//获取static带参方法Method method3 = clazz.getMethod("drink", null);method3.invoke(clazz, null);}


输出结果
            person eat            person eat:apple            person private method drink:water            person static method drink:



获取字段

核心方法





Person类

public class Person {public String secret ="handsome";private String name ="fan";public static int age = 21;}


测试程序

@org.junit.Testpublic void test1() throws Exception{//获取类对象Class clazz = Class.forName("org.nihaoi.fan.Person");//获取public属性值Field field = clazz.getField("secret");System.out.println(field.get(clazz.newInstance()));System.out.println(field.getType());//获取private属性值Field field0 = clazz.getDeclaredField("name");field0.setAccessible(true);field.getType();System.out.println(field0.get(clazz.newInstance()));System.out.println(field0.getType());//获取static属性值Field field1 = clazz.getField("age");System.out.println(field1.get(null));System.out.println(field1.getType());}

测试结果

                handsome                class java.lang.String                fan                class java.lang.String                21                int



0 0
原创粉丝点击