Java中反射技术的实例

准备一个实体类:

package test.reflect;
/**
 * 反射使用的实体类
 *
 * @author liulei on 2018/11/28
 */
public class User {
    //字段
    private String username;
    private String pwd;
    private String uid="1001";
    //构造方法
    public User(){

    }

    public User(String username){
        this.username=username;
    }
    public User(String username,String pwd){
        this.username=username;
        this.pwd=pwd;
    }
    //实例方法
    public void function1(){
        System.out.println("function1");
    }

    public void function2(String username){
        System.out.println("function2");
    }

    public String function3(String username,String pwd){
        System.out.println("function3");
        return username;
    }

    public String getUid(){
        return  uid;
    }
}

测试类:

package test.reflect;

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

/**
 * 反射的测试类
 *
 * @author liulei on 2018/11/28
 */
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
        //获取一个类对象
        Class<?> c = Class.forName("test.reflect.User");
        //获取一个无参数的构造器
        Constructor<?> constructor = c.getConstructor();
        //利用构造方法创建对象
        Object o = constructor.newInstance();
        //因为字段是私有的,所以不能这样获取
        // Field field = c.getField(null);
        Field[] declaredFields = c.getDeclaredFields();
        //循环输出字段
        for(int i=0;i<declaredFields.length;i++){
            //设置私有字段可以访问,如果不设置这一步,就会报private错误
            declaredFields[i].setAccessible(true);
            System.out.println("ziduan:"+declaredFields[i].getName());
           // System.out.println(declaredFields[i].toString());
        }

//获取构造方法
        System.out.println(c.getDeclaredConstructor(null));
        System.out.println(c.getConstructor(String.class));
        System.out.println(c.getConstructor(String.class,String.class));

        //获取实例方法的名称
        System.out.println(c.getMethod("function1").getName());
        System.out.println(c.getMethod("function2", String.class).getName());
        System.out.println(c.getMethod("function3", String.class, String.class).getName());
        //method和invoke;invoke是调用实例方法
        Method function1 = c.getDeclaredMethod("function1");
        function1.invoke(o);

        //获取实体类中的常量值
        Method id= c.getDeclaredMethod("getUid");
        //invoke方法是对有参数的方法进行调用
        Object invoke = id.invoke(o);
        System.out.println(invoke);

        Method function3 = c.getDeclaredMethod("function3", String.class, String.class);
        String name=function3.invoke(o,"zhangsan","lisi").toString();
        System.out.println("1111111111");
        System.out.println(name);
    }
}

猜你喜欢

转载自blog.csdn.net/W_violet/article/details/84590640
今日推荐