【Java基础】note反射

实体类

public class User {
    public Integer age;
    protected Long id;
    Byte bytes;
    private String username;

    public User(){}

    public User(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String introduce() {
        return "name ----- " + username;
    }

    public static String hello() {
        return "Hello World";
    }
}

测试方法

/**
 * 反射机制:操纵对象的字节码文件
 */
public class ReflexTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class<?> userClass = Class.forName("reflex.User");
        // 获取Java对象字节码的三种方式
        getObjectClass();
        // 反射实例化对象
        getInstance(userClass);
        // 获取对象的方法(普通以及实例)
        getMethods(userClass);
        // 获取对象的属性
        getFields(userClass);
    }

    /**
     * 获取Java对象字节码的三种方式
     */
    public static void getObjectClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        // 第一种方式: 类名.class
        System.out.println(User.class); // class reflex.User
        // 第二种方式: 创建对象方法获取其实例
        System.out.println(new User().getClass()); // class reflex.User
        // 第三种方式: 使用Class类forName(String className)方法
        // 其中className就是在java包下的类文件路径
        System.out.println(Class.forName("reflex.User")); // class reflex.User
    }

    /**
     * 通过反射实例化对象
     */
    public static void getInstance(Class<?> userClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        System.out.println(userClass.getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2
        // 注意调用对象字节码文件的newInstance()方法时 如果没有无参构造会报错:java.lang.NoSuchMethodException
        System.out.println(userClass.newInstance()); // reflex.User@1b6d3586
        // 获取这个对象的所有注解
        Annotation[] annotations = userClass.getAnnotations();
        for(Annotation annotation : annotations) {
            System.out.println("注解: " + annotation);
        }
        System.out.println(userClass.getTypeName()); // reflex.User
    }

    /**
     * 获取对象的普通方法以及实例(非静态)方法
     */
    public static void getMethods(Class<?> userClass) throws ClassNotFoundException {
        // 获取这个对象的所有普通方法
        Method[] methods = userClass.getMethods();
        for (Method method : methods) {
            // hello getUsername setUsername introduce wait wait wait equals toString hashCode getClass notify notifyAll
            System.out.println("普通method: " + method.getName());
        }
        // 获取这个对象的所有实例/非静态方法
        Method[] declaredMethods = userClass.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println("实例/非静态: " + method.getName()); // getUsername setUsername introduce
        }
    }

    /**
     * 获取对象的公开属性以及所有属性
     */
    public static void getFields(Class<?> userClass) throws ClassNotFoundException {
        // 获取对象的公开属性
        Field[] fields = userClass.getFields();
        for(Field field : fields) {
            System.out.println("属性权限: " + field.getModifiers()); // 1
            System.out.println("属性类型: " + field.getType()); // class java.lang.Integer
            System.out.println("属性名称: " + field.getName()); // age
        }
        // 获取对象的所有属性
        Field[] declaredFields = userClass.getDeclaredFields();
        for(Field field : declaredFields) {
            // 1 4 0 2
            System.out.println("属性权限: " + field.getModifiers());
            // class java.lang.Integer | class java.lang.Long | class java.lang.Byte | class java.lang.String
            System.out.println("属性类型: " + field.getType());
            // age id bytes username
            System.out.println("属性名称: " + field.getName());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值