java反射的简单实践

package wang.study.reflect;

import lombok.Data;

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

@Data
public class User {

    private String name;

    private String passwd;

    private Integer age;

    @Data
    class Book{
        private String bookName;
        private Integer pages;

        private String read(){
            System.out.println("read book ing...");
            return "hong lou meng";
        }

        public Book(String bookName, Integer pages) {
            this.bookName = bookName;
            this.pages = pages;
        }
    }

    public User() {
    }

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

    public User(String name, String passwd) {
        this.name = name;
        this.passwd = passwd;
    }

    public User(String name, String passwd, Integer age) {
        this.name = name;
        this.passwd = passwd;
        this.age = age;
    }

    private void greet(){
        System.out.println("greet");
    }

    private void greet(String msg){
        System.out.println("greet"+msg);
    }

    private String greet(String msg,String name){
        String str = "name is:"+name+"greet"+msg;
        return str;
    }

    public static void main(String[] args) throws Exception{
        Class<?> clzz = Class.forName("wang.study.reflect.User");
//        User o = (User)clzz.newInstance();
//        o.setName("ctl");
//        System.out.println(o.getName());

//        Constructor<?> constructor = clzz.getConstructor(String.class);
//        User o = (User)constructor.newInstance("css");
//        System.out.println(o.getName());

//        Constructor<?> constructor = clzz.getConstructor(String.class, String.class);
//        User o = (User)constructor.newInstance("css","123456");
//        System.out.println(o.getName()+o.getPasswd());

//        Method greet = clzz.getDeclaredMethod("greet");
//        greet.invoke(clzz.newInstance());

//        Method greet = clzz.getDeclaredMethod("greet",String.class);
//        greet.invoke(clzz.newInstance(),"哈哈哈哈哈");

//        Method greet = clzz.getDeclaredMethod("greet",String.class,String.class);
//        String invoke = (String)greet.invoke(clzz.newInstance(), "哈哈哈哈哈", "ctl");
//        System.out.println(invoke);

//        Field name = clzz.getDeclaredField("name");
//        Object o = clzz.newInstance();
//        name.set(o,"wang da chui");
//        System.out.println(name.get(o));
        User o = (User)clzz.newInstance();
        Class<?> clzz2 = Class.forName("wang.study.reflect.User$Book");
        Method read = clzz2.getDeclaredMethod("read");
        //可见性
        read.setAccessible(true);
        Object honglou = read.invoke(clzz2.getDeclaredConstructor(User.class,  String.class, Integer.class).newInstance(o, "honglou", 10));
        System.out.println(honglou);

 Constructor<?> declaredConstructor = clzz2.getDeclaredConstructor(User.class);
        Object o1 = declaredConstructor.newInstance(o);
        System.out.println(o1);
    }


}

反射先获取到class对象
然后获取 constructor、field、method的对象
如果需要实例化,可以调用constructor的方法
如果需要调用method,注意传实例化对象和参数
如果需要设置field,注意传实例化对象和值
如果 需要获取值,注意传实例化对象

对于内部类,需要同时获取外部和内部类的class对象,内部类是$xx添加
当调用内部类方法,注意传外部类对象类型。
可以参考参考

内部类创建注意点

内部类的构造方法,即使是无参构造,参数其实也是传递了外部类的类型的,在实例化的时候,要传递外部类实例化的对象,否则创建会失败。

Constructor<?> declaredConstructor = clzz2.getDeclaredConstructor(User.class);
Object o1 = declaredConstructor.newInstance(o);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值