java反射第二天

反射的一些方法

此处我创建了一个fanshe类,用来提供一些基本的成员变量、成员方法,为后面的测试做准备,在此处没有表述出来,此文章里的代码部分均为测试类的代码。

 //2.通过单元测试方法获取类的字节码文件
    @Test
    public  void  getclazz() throws ClassNotFoundException {
        Class<?> cl1 = Class.forName("fansheLearn.fansheTest");//包名.类名

       Class<?> cl2= fansheTest.class;
        Class<? extends fansheTest> cl3= new fansheTest().getClass();
        System.out.println(cl1);//class fansheLearn.fansheTest
        System.out.println(cl2.getName());//fansheLearn.fansheTest 全路径名
        System.out.println(cl3.getSimpleName());//fansheTest 类名
        System.out.println(cl1.getPackage());//package fansheLearn对象
        System.out.println(cl1.getPackage().getName());//fansheLearn包名

如何获取类的方法

说明:第一句获取字节码对象是前提,必须要有。
getMethods()是获取所有的方法,不是用getMethod()
m.getParameterTypes();是获取参数的

 Class<?> c1 = Class.forName("fansheLearn.fanshe");
        Method[] ms=c1.getMethods();
        System.out.println(Arrays.toString(ms));
        for (Method m:ms
             ) {
            System.out.println(m.getName());
            Class<?>[] types= m.getParameterTypes();
            System.out.println(Arrays.toString(types));
            System.out.println();
        }

获取构造方法

Constructor<?>[] constructors = c1.getConstructors();
        for (Constructor c:constructors
             ) {
            System.out.println(c.getName());
            Class[] parameterTypes = c.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));
        }
        System.out.println("____________________________________________");
        //成员变量的修饰符必须是public才可以,默认修饰符都是不可以的
        Field[] fields = c1.getFields();
        for (Field f:fields
             ) {
            System.out.println(f);
            System.out.println(f.getName());
            System.out.println(f.getType());

        }

获取成员变量

说明:成员变量的修饰符必须是public才可以,默认修饰符都是不可以的

   //成员变量的修饰符必须是public才可以,默认修饰符都是不可以的
        Field[] fields = c1.getFields();
        for (Field f:fields
             ) {
            System.out.println(f);
            System.out.println(f.getName());
            System.out.println(f.getType());

        }

反射创建对象

方法一:通过触发目标类的无参构造创建对象
方法二:通过触发目标类的全参构造创建对象

Class<?>  cl=fanshe.class;
//反射创建对象方案一
        Object o = cl.newInstance();
        System.out.println(o);
//反射创建对象方案二
        Constructor<?> constructor = cl.getConstructor(String.class,int.class);
        Object o1 = constructor.newInstance("萍萍", 6);
        System.out.println(o1);

暴力反射

说明:此处代码是给baolifanshe这个类的成员变量设置值,并且name是私有的
name.setAccessible(true); 暴力反射,需要设置私有可见权限

 @Test
    public void getField() throws Exception {
        Class <?> cl=baolifnashe.class;
        Field name = cl.getDeclaredField("name");
        //name.setAccessible(true); 暴力反射,需要设置私有可见权限
        name.setAccessible(true);
        System.out.println(name);
        System.out.println(name.getType());
        System.out.println(name.getType().getName());
        Object o = cl.newInstance();
        //set(m,n)m是给哪个对象的name属性设置值,n是设置的值是什么
        name.set(o,"余生请多指教");
        System.out.println(name.get(o));//余生请多指教
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值