反射(4)

获取类的运行时结构

package com.reflection;

/**
 * 获取运行时类的完整结构
 * 通过反射获取运行时类的完整结构
 * Field Method Constructor Superclass Interface Annotation
 * 实现的全部接口、所继承的父类、全部的构造器、全部的方法、全部的Field、注解
 * @author 长空扯淡
 */

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

public class Test05 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class c1 = Class.forName("com.reflection.User");

       /* User user = new User();
        c1 = user.getClass();
        */

        //获得类的名字
        System.out.println(c1.getName());
        System.out.println(c1.getSimpleName());

        //获得类的属性
        Field[] fields = c1.getFields(); //只能找到public属性

        fields = c1.getDeclaredFields(); //找到全部属性
        for (Field field : c1.getDeclaredFields()){
            System.out.println(field);
        }

        //获得指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println(name);

        //获得类的方法
        System.out.println("===================================================");
        Method[] methods = c1.getMethods(); //获得本类及其父类的全部public方法
        for (Method method:methods){
            System.out.println("正常的:"+method);
        }
        methods = c1.getDeclaredMethods(); //获得本类的所有方法
        for (Method method:methods){
            System.out.println("getDeclaredMethods:"+method);
        }

        //获得指定方法
        //重载
        Method getName = c1.getMethod("getName",null);
        Method setName = c1.getMethod("setName",String.class);
        System.out.println(getName);
        System.out.println(setName);

        //获得的构造器
        System.out.println("===================================================");
        Constructor[] constructors = c1.getConstructors();
        for (Constructor constructor : constructors){
            System.out.println(constructor);
        }

        Constructor[] constructors1 = c1.getDeclaredConstructors();
        for (Constructor constructor:constructors1){
            System.out.println(constructor);
        }

        //获得指定的构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
        System.out.println("指定:"+declaredConstructor);
    }
}

动态创建对象执行方法

package com.reflection;

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

public class Test06 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1 = Class.forName("com.reflection.User");

/*
        //构造一个对象----若User类中有无参构造,这种方法才有用,否者会报错
        User user = (User)c1.newInstance();
        System.out.println(user);
*/

/*
        //没有无参构造,也可以通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class);
        User user2 = (User)constructor.newInstance("一叶知秋", 20);
        System.out.println(user2);
*/

        //通过反射调用普通方法
        User user3 = (User)c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke激活的意思     (对象,"方法的值")
        setName.invoke(user3,"大漠孤烟");
        System.out.println(user3.getName());

        System.out.println("---------------------------------------------");
        //通过反射操作属性
        User user4 = (User)c1.newInstance();
        Field name = c1.getDeclaredField("name");

        //不能直接操作私有属性,需要关闭程序的安全检测,属性或者方法的setAccessible(true)  设置为true
        name.setAccessible(true);//                          Accessible  是可进入的意思
        name.set(user4,"夜雨声烦");
        System.out.println(user4.getName());
    }
}

 

posted @ 2022-05-11 11:03  长空扯淡  阅读(27)  评论(0)    收藏  举报