利用Java的反射操作一个类的所有构造函数、字段、方法

一,问题

今天看Spring AOP的时候,有涉及Java的反射机制。想到自己这方面很久没碰了,就去玩一下。想不到反射真的强大的,哈哈哈!!!文章最后面有源代码。

二,解决方案

2.1 利用获取Class类的三种方式

①通过全限定名:    Class c = Class.forName("top.kolo.polo.User");
②通过类名:       Class c = User.class;
③通过对象:       Class c = user.getClass();

2.2 利用Class类操作类的构造函数、字段、方法

App类:

public class App 
{
    public static void main( String[] args )
    {
       //获取Class类的三种方式
        //  ①通过全限定名:    Class c = Class.forName("top.kolo.polo.User");
        //  ②通过类名:       Class c = User.class;
        //  ③通过对象:       Class c = user.getClass();

        try {
            Class c = Class.forName("top.kolo.polo.User");

            System.out.println(c.getName());

            System.out.println("==================利用反射操作构造函数========================");

            //操作构造函数
                //调用无参构造函数,同时取消对方法的权限访问
                Constructor noArgConstructor = c.getDeclaredConstructor();
                noArgConstructor.setAccessible(true);
                User defaultUser = (User)noArgConstructor.newInstance();
                System.out.println(defaultUser.toString());

                //调用有参的构造函数
                Constructor argConstructor = c.getDeclaredConstructor(int.class, String.class);
                argConstructor.setAccessible(true);
                User initUser = (User)argConstructor.newInstance(18,"kolo");
                System.out.println(initUser.toString());

            System.out.println("==================利用反射操作字段========================");

            //操作字段
                //获取所有定义的字段,包括private和protected。同时取消对字段的权限验证
                Field[] fields = c.getDeclaredFields();
                    //先获取这个类的全部字段类型
                for (Field f: fields
                     ) {
                    f.setAccessible(true);
                    //f.get(对象)表示从这个对象中获取这个字段的值。其中f表示字段名
                    System.out.println(f.getName() + " " + f.get(initUser));
                }

            System.out.println("==================利用反射操作方法========================");

            //操作方法
                //获取所有定义的方法,包括private和protected
                Method[] methods = c.getDeclaredMethods();
                for (Method m: methods
                ) {
                    System.out.println(m.getName());
                }
                //先获取指定的方法,然后再指定需要执行的方法的对象
                Method setNameMethod = c.getMethod("setName", String.class);
                setNameMethod.invoke(initUser,"jack");
                Method method = c.getMethod("say");
                method.invoke(initUser);


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

User类:

public class User {

    private int age;

    private String name;

    User(){
    }

    User(int age , String name){
        this.age = age;
        this.name = name;
    }

    public void say(){
        System.out.println("我是:"+this.name);
        System.out.println("哈哈哈,嘿嘿嘿!");
    }

    public void write(){
        System.out.println("我在写字呢!!!");
    }

    protected void tell(){
        System.out.println("啊啊啊!!");
    }

    private void heart(){
        System.out.println("这是私有方法!");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

你可能感兴趣的:(JAVA进阶)