Java 反射

这篇博客探讨了Java的反射机制,它允许在运行时动态获取类的各种信息,如属性、方法、构造器、注解和接口。文中通过ReflectClass类的实际操作示例,详细阐述了反射的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射:java反射就是在运行时动态获取类的各个组成部分的信息,包括属性、方法、构造方法、注解、接口、父类等。

这里以ReflectClass类为例,以下是一个放射类的操作实例:


package util;

import model.MethodInfo;
import model.Test;

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

/**
 * 注:ReflectClass reflectClass = new ReflectClass();
      reflectClass.initClass("model.App");
      reflectClass.initConstructor();
      reflectClass.initObject();
      reflectClass.getAnnotationInfos();
 */
public class ReflectClass {

    /**
     * 即将要被反射的Class对象
     */
    private Class<?> mClazz;
    /**
     * 被放射对象的实例
     */
    private Object mObj;
    /**
     * 构造函数对象
     */
    private Constructor<?> constructor;

    public ReflectClass(){}

    /**
     * 初始化反射类的Class对象,并实例化
     * @param className
     */
    public void initClass(String className) throws Exception {
        mClazz = Class.forName(className);
    }

    /**
     * 获取构造函数对象
     * @param paramTypes
     * @throws Exception
     */
    public void initConstructor(Class<?>... paramTypes) throws Exception {
        constructor = mClazz.getConstructor(paramTypes);
    }

    public void initObject(String... param) throws Exception {
        mObj = constructor.newInstance(param);
    }


    public Object invoke(String methodName,Object... args) throws Exception {
        Method method = mClazz.getDeclaredMethod(methodName);
        return method.invoke(mObj,args);
    }

    /**
     * 为属性设置值
     * @param name
     * @param grade
     * @throws Exception
     */
    public void setField(String name,int grade) throws Exception {
        Field field = mClazz.getDeclaredField("mGrade");
        field.setAccessible(true);
        field.set(mObj,grade);
    }

    /**
     * 获取父类
     */
    public void getSuperClass(){
        Class<?> superClass = mClazz.getSuperclass();
        while(superClass !=null){
            System.out.println(superClass.getName());
            superClass = superClass.getSuperclass();
        }
    }

    /**
     * 获取接口
     */
    public void showInterface(){
        Class<?>[] interfaces = mClazz.getInterfaces();
        for(Class<?> i : interfaces){
            System.out.println(i.getName());
        }
    }

    public void getAnnotationInfos() throws Exception {
        Method method = mClazz.getMethod("getAppName");
        Annotation[] annotations = method.getAnnotations();
        for(Annotation annotation : annotations){
            if(method.isAnnotationPresent(MethodInfo.class)){
                MethodInfo methodInfo = (MethodInfo) annotation;
                System.out.println(methodInfo.author());
                System.out.println(methodInfo.date());
                System.out.println(methodInfo.version());
            }
        }
    }

    public void showFields(){
        Field[] fields = mClazz.getFields();
        //获取当前类以及父类的所有公有属性
        for(Field f : fields){
            System.out.println(f.getName());
        }
    }

    public void setFieldFromAnnotation()throws Exception{
        //获取私有的属性(包括private、protected),只能获取当前类
        Field field = mClazz.getSuperclass().getDeclaredField("mName");
        field.setAccessible(true);
        Test test = field.getAnnotation(Test.class);
//        Object obj = mClazz.getSuperclass().getConstructor().newInstance();
        field.set(mObj,test.name());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值