反射的基本使用Reflect

1.反射介绍

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性;

2.获取Class类对象

public class test02 {
    public static void main(String[] args) throws ClassNotFoundException {
    //使用class类中的静态方法forName(Stirng className)
        Class<?> c1 = Class.forName("test.Fa");
        System.out.println(c1);
        System.out.println("=======");
    //调用对象的getClass()方法,返回对象所属类的Class对象
        Fa f=new Fa();
        Class<? extends Fa> c2 = f.getClass();
        System.out.println(c2);
        System.out.println("=======");
    //使用类的class属性来获取该类的对应的class对象
        Class<Fa> faClass = Fa.class;
        System.out.println(faClass);
​
​
    }
}

三种方式

类名.class属性

对象名.getClass()方法

Class.for Name(全类名)方法

2.1示例代码

public class test02 {
    public static void main(String[] args) throws ClassNotFoundException {
    //使用class类中的静态方法forName(Stirng className)
        Class<?> c1 = Class.forName("test.Fa");
        System.out.println(c1);
        System.out.println("=======");
    //调用对象的getClass()方法,返回对象所属类的Class对象
        Fa f=new Fa();
        Class<? extends Fa> c2 = f.getClass();
        System.out.println(c2);
        System.out.println("=======");
    //使用类的class属性来获取该类的对应的class对象
        Class<Fa> faClass = Fa.class;
        System.out.println(faClass);
​
​
    }
}

2.2结果

class test.Fa

class test.Fa

class test.Fa

3.Class类获取构造方法对象的方法

方法

1.Constructor[] getConstructors() 返回所有公共构造方法对象的数 组

2.Constructor[] getDeclaredConstructors() 返回所有构造方法对象的数组

3.Constructor getConstructor(Class... parameterTypes) 返回单个公共构造方法对象

4.Constructor getDeclaredConstructor(Class... parameterTypes)返回单个构造方法对象

3.1示例代码

Class<?> c = Class.forName("com.ithema_02.Student");
​
Constructor<?>[] cons1 = c.getConstructors();//返回公共构造方法组
for (Constructor<?> con : cons1) {
    System.out.println(con);
}
System.out.println("==========");
Constructor<?>[] cons = c.getDeclaredConstructors();//返回所有的构造方法组
​
for (Constructor con : cons) {
   // System.out.println(con);
}
Constructor<?> c1 = c.getConstructor();//返回单个公共构造方法
Object obj=c1.newInstance();
System.out.println(obj);
System.out.println("==========");
​
Constructor<?> c2 = c.getDeclaredConstructor(String.class);//可以单个返回所有的构造方法
//暴力反射
c2.setAccessible(true);//为true时,取消范围检查
Object obj1=c2.newInstance("刘大花");
​
System.out.println(obj1);

T newInstance(Object...initargs) 根据指定的构造方法创建对象

3.2结果

public com.ithema_02.Student(java.lang.String,int,java.lang.String)

public com.ithema_02.Student()

Student{name='null', age=0, address='null'}

Student{name='刘大花', age=0, address='null'}

4.反射获取成员变量并使用

4.1Class类获取成员变量对象的方法

Field[] getFields() 返回所有公共成员变量对象的数组

Field[] getDeclaredFields() 返回所有成员变量对象的数组

Field getField(String name) 返回单个公共成员变量对象

Field getDeclaredField(String name) 返回单个成员变量对象

4.2示例代码:

 Class<?> c = Class.forName("com.ithema_02.Student");
        //Field[] getFields() 返回一个包含 Field对象的数组, Field对象反映由该 Class对象表示的类或接口的所有可访问的公共字段
        //Field[] getDeclaredFields() 返回一个 Field对象的数组,反映了由该 Class对象表示的类或接口声明的所有字段
//        Field[] fields = c.getFields();
​
        Field[] f = c.getDeclaredFields();
        for (Field field : f) {
            System.out.println(field);
        }
​
        //Field getField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定公共成员字段
        //Field getDeclaredField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定声明字段
​
        Field field1 = c.getField("age");
       System.out.println(field1);
        System.out.println("========");
​
        Field addressField = c.getField("address");
        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
​
//        obj.addressField = "天山";
​
        //Field提供有关类或接口的单个字段的信息和动态访问
        //void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值
        addressField.set(obj,"天山"); //给obj的成员变量addressField赋值为西安
        field1.set(obj,20);
        System.out.println(obj);

4.3运行结果:

private java.lang.String com.ithema_02.Student.namepublic int com.ithema_02.Student.agepublic java.lang.String com.ithema_02.Student.address

public int com.ithema_02.Student.age

Student{name='null', age=20, address='天山'}

5.反射获取成员方法

Method[] getMethods() 

返回所有公共成员方法对象的数组,包 括继承的

Method[] getDeclaredMethods()

返回所有成员方法对象的数组,不包括 继承的

Method getMethod(String name, Class... parameterTypes)

返回单个公共成员方法对象

Method getDeclaredMethod(String name, Class... parameterTypes)

返回单个成员方法对象

另外:Object invoke(Object obj,Object...args)调用obj对象的成员方法,参数是args,返回值是Object类型

5.1代码示例

Class<Student> sc = Student.class;
System.out.println(sc);
Constructor<Student> con = sc.getConstructor();
Object obj=con.newInstance();
​
Method method = sc.getMethod("method1");
System.out.println(method);
System.out.println(obj);
​
method.invoke(obj);
Method method2 = sc.getMethod("method2", String.class);
method2.invoke(obj,"zhangsan");

5.2展示结果

class com.ithema_02.Studentpublic void com.ithema_02.Student.method1()Student{name='null', age=0, address='null'}methodmethod:zhangsan

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值