java——了解反射

一,Java反射机制

1、是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。

2、由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定。在运行期仍然可以扩展

二,获得Class类的对象

使用类的class属性来获取该类对应的Class对象。举例: Student.class将会返回Student类对应的Class对象
调用对象的getClass()方法,返回该对象所属类对应的Class对象
使用Class类中的静态方法forName(StringclassName),该方法需要传入字符串参数。该字符串参数的值是某个类的全路径,也就是完整包名的路径

Class<?> a = Class.forName("day36.Student");

三,反射获取构造方法并使用

Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes):返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):返回单个构造方法对象

Constructor类中用于创建对象的方法
T newInstance(Object... initargs):根据指定的构造方法创建对象
当获得的构造方法是私有构造方法时,需要加上setAccessible(true)

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class<?> a = Class.forName("day36.Student");

//        获得单个的指定的public的构造方法
//        Constructor<?> con = a.getConstructor(String.class, int.class, String.class);
//        Object o = con.newInstance("Tom",45,"man");
//        System.out.println(o);

//        获得指定的构造方法
        Constructor<?> dec = a.getDeclaredConstructor(String.class, int.class);
//        取消访问检查,这样才能用私有构造器
        dec.setAccessible(true);
        Object tom = dec.newInstance("Tom", 40);
        System.out.println(tom);

//        获得public构造方法组成的数组
//        Constructor<?>[] con = a.getConstructors();
//        for(Constructor c:con){
//            System.out.println(c);
//        }

//        获得所有构造方法组成的数组
//        Constructor<?>[] dec = a.getDeclaredConstructors();
//        for(Constructor c:dec){
//            System.out.println(c);
//        }


    }

四,反射获取成员变量并使用

跟上面的构造方法差不多,不过成员变量对象的数据类型为Field,所以
getField(),getFields(),getDeclaredField(),getDeclaredFields()
 

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> a = Class.forName("day36.Student");
        Constructor<?> con = a.getConstructor();

        Object obj = con.newInstance();

//        得到成员变量操作
        Field nameField = a.getDeclaredField("name");
//        使用私有成员变量,需要取消访问检查
        nameField.setAccessible(true);
        Field ageField = a.getDeclaredField("age");
        Field sexField = a.getField("sex");

//       给成员变量赋值操作,用Field类的set方法
        nameField.set(obj,"Tom");
        ageField.set(obj,40);
        sexField.set(obj,"man");

        System.out.println(obj);
    }

五,反射获取成员方法并使用

同样的,成员方法对象的数据类型为Methond,所以
getMethond(),getMethonds(),getDeclaredMethond(),getDeclaredMethonds()

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<?> a = Class.forName("day36.Student");

        Constructor<?> con = a.getConstructor();
        Object obj = con.newInstance();

//        这是个带参有返回值的方法,后面的是返回值类型
        Method methond4 = a.getMethod("methond4", String.class);
//        通过这个方法对象调用invoke方法,把Studen对象和想用的Student的方法需要的参数传进去,返回值是Object类型的
        String s= (String) methond4.invoke(obj,"Tom");
        System.out.println(s);

        Method methond1 = a.getDeclaredMethod("methond1");
        methond1.setAccessible(true);
        methond1.invoke(obj);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值