利用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 + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值