19Java语法回顾之反射

Java语法回顾之反射


读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。

反射获取字节码文件

/*
 * 反射:在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。
 * 
 * 那么,我们是如何获取到class文件对象的呢?(字节码文件对象)
 * A:Object类的getClass()方法。
 * B:数据类型的静态的class属性
 * C:通过Class类的静态方法forName(String className)
 * 
 * 到底使用哪一种呢?
 * 开发中用第三种。自己写例子测试可以使用前两种。
 * 因为第三种方式可以结合配置文件使用。
 */

反射获取字节码文件

/**
 * 通过反射获取字节码文件
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException {
        MyPerson my = new MyPerson();
        Class<? extends MyPerson> myClass = my.getClass();

        MyPerson mp = new MyPerson();
        Class<? extends MyPerson> aClass = mp.getClass();

        System.out.println(myClass.equals(aClass));//true

        Class<MyPerson> myPersonClass = MyPerson.class;

        System.out.println(aClass==myPersonClass);//true

        //第三种,开发时使用的方式
        Class aClass1 = Class.forName("cn.itcast_01.MyPerson");
        System.out.println(myPersonClass==aClass1);//true
    }
}

通过反射获取构造方法

/**
 * 反射获取构造方法并使用。
 * <p/>
 * 构造方法     Constructor
 * 成员变量     Field
 * 成员方法     Method
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> aClass = Class.forName("cn.itcast_01.MyPerson");
        //获取构造器对象
        // 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。
        Constructor<?> constructor = aClass.getConstructor();
        //带参构造方法
        Constructor<?> constructor2 = aClass.getConstructor(int.class,String.class);
        //通过Constructor创建实例对象
        Object o = constructor.newInstance();
        Object hsia = constructor2.newInstance(23, "Hsia");
        System.out.println("无参构造"+o);
        System.out.println("带参构造"+hsia);
        System.out.println("*******************");
    }
}

反射获取成员变量并使用

/**
 * 获取私有成员变量并使用
 */
public class MyReflectField {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取字节码文件
        Class<?> c = Class.forName("cn.itcast_01.MyPerson");
        //创建对象
        Constructor<?> constructor = c.getConstructor();
        Object obj = constructor.newInstance();
        //没有设置值之前的obj对象
        System.out.println("初始化前的值:" + obj);

        //获取共有字段名称
        Field age = c.getField("age");
        //给共有字段设置值
        age.set(obj, 23);

        //获取私有字段
        Field name = c.getDeclaredField("name");
        //暴力访问
        name.setAccessible(true);//不要限制我。
        name.set(obj, "Hsia");//报错   java.lang.IllegalAccessException:

        //设置值后的对象
        System.out.println("初始化后的值:" + obj);
    }
}

反射获取成员方法并使用

/**
 * 获取成员方法并使用。
 */
public class MyReflect {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取字节码文件
        Class<?> c = Class.forName("cn.itcast_01.MyPerson");
        //创建对象
        Constructor<?> constructor = c.getConstructor();
        Object obj = constructor.newInstance();
        //1.获取成员方法 无参无返回值
        Method show = c.getMethod("show");
        show.invoke(obj,null);
        System.out.println("——————————————————");
        //2.获取成员方法 带参无返回值
        Method function = c.getMethod("function",String.class);
        function.invoke(obj,"Hsia");
        System.out.println("——————————————————");
        //3.获取成员方法 带参有返回值
        Method reutrnValue = c.getMethod("reutrnValue", String.class, int.class);
        //return 的返回值
        Object hsia = reutrnValue.invoke(obj, "Hsia", 23);
        System.out.println(hsia);
        System.out.println("——————————————————");
        //4.获取私有成员方法
        Method helloworld = c.getDeclaredMethod("hello");
        //设置暴力访问
        helloworld.setAccessible(true);
        helloworld.invoke(obj,null);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值