Java反射机制

背景知识

  • Class类(反射机制实现的基础)

     Java中的Class的类是一个特殊的类,JVM加载字节码文件的时候,在方法区中为每一个类创建一个对应的Class类对象,这个对象中包含类的信息:方法,字段,注解等。

 

是什么
  可以在运行时动态的获取类的信息。(比如:类里面定义的方法,字段,注解等信息)


有什么用
  可以提高程序的可扩展性,以前没新增加一个类就需要修改原来的程序,以兼容新的类,现在只需要通过反射就能够获取到新增的自定义类信息,不需要每次修改原来的程序。

 

编程实例,代码中会包含以下几个部分的实现。

  • 如何获取类的信息(三种方法)
  • 如何通过构造函数串参数
  • 如何获取到一个指定的函数,并执行

首先,先定义一个用于反射的类

package priv.darrenqiao.reflection;

/*
 * @Author : darrenqiao
 * */

public class ReflectionClass {
    public String name;
    public Integer age;
    
    private String result;
    public void testName() {
        
    }
    
    public ReflectionClass(String result) {
        super();
        this.result = result;
    }

    public void show(String test) {
        System.out.println("show result " + this.result + " and " + test);
    }
    
    public void testAge() {
        
    }
    
}

然后我们通过main方法类进行反射机制的实现package priv.darrenqiao.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
 * @Author : darrenqiao
 * */

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
     
//获取类方法一 ReflectionClass reflection = new ReflectionClass("success"); Class<?> classInfoForReflection = reflection.getClass(); //获取类方法二 //Class<ReflectionClass> classInfoForReflection = ReflectionClass.class; //获取类方法三,比较常用的是这种,因为后面的类全路径可以作为配置项放到配置文件中动态的获取 //Class<?> classInfoForReflection = Class.forName("priv.darrenqiao.reflection.ReflectionClass"); Method[] methods = classInfoForReflection.getMethods(); System.out.println("methods for class classInfoForReflection is"); for (Method m : methods) { System.out.println(m.getName()); } //通过构造函数传参数 Class<ReflectionClass> classInfoForReflectionClass = ReflectionClass.class; Constructor<?> c = classInfoForReflectionClass.getConstructor(String.class);
Object reflectionObject
= (Object) c.newInstance("failed"); //执行指定函数 Method method = classInfoForReflectionClass.getMethod("show", String.class); method.invoke(reflectionObject, "test final"); } }

 

posted @ 2018-06-17 12:48  darrenqiao  阅读(112)  评论(0编辑  收藏  举报