反射技术

1.

反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,

把各个组成部分映射成一个个对象。

2

三种获得class文件的方法

类名.class,   对象.getClass()     Class.forName(“类名”)

        //方法1
        Class clazz1=cn.example.People.class;
        //方法2
        Class clazz2=Class.forName("cn.example.People");
        //方法3
        People p=new People();
        Class clazz3=p.getClass();

3

通过反射获取对象

package cn.example;

public class People {
    String name;
    public People(){
        System.out.println("People");
    }
    public People(String name){
        this.name=name;
        System.out.println("People(name)");
    }
}
package cn.example;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class Demo {
    @Test
    public void test() throws Exception{
    
        Class clazz2=Class.forName("cn.example.People");
        Constructor c=clazz2.getConstructor(String.class);
        People p=(People) c.newInstance("张三");
        System.out.println(p.name);
    }

    
}

People(name)
张三

4 Constructor
得到某个类所有的构造方法:




5暴力访问
x.setAccessible(true);
这样可以得到私有的方法和属性,但之前要用getDeclare****;


6得到方法,字段,设置字段
package cn.example;

public class People {
    private String name;
    public People(){
        System.out.println("People");
    }
    public People(String name){
        this.name=name;
        System.out.println("People(name)");
    }
    public void print() {
        System.out.println("my name is"+name);
    }
}

package cn.example;

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

import org.junit.Test;

public class Demo {
    @Test
    public void test() throws Exception{
        People p=new People("李四");
        Class clazz2=Class.forName("cn.example.People");
        Field f=clazz2.getDeclaredField("name");
        f.setAccessible(true);
        //获取字段
        Object obj=f.get(p);
        //获取字段类型
        Class Type=f.getType();
        //打印字段值
        if(Type.equals(String.class)){
            String str=(String)obj;
            System.out.println(str);
        }
        //设置字段
        f.set(p, "王五");
        //System.out.println((String)f.get(p));
        //获取方法
        Method m=clazz2.getMethod("print",null);
        //调用方法
        m.invoke(p, null);
        
        
    }
People(name)
李四
my name is王五
 
原文地址:https://www.cnblogs.com/xurui1995/p/5246042.html