Java基础之—反射

在运行状态中,对于一个任意类,可以获取类的属性和方法对于任意一个对象,可以调用对象属性和方法。这种动态获取信息及动态调用属性和方法的功能称为反射机制

实际使用时,就是把Java类中各个成分通过Class对象映射成一个个Java对象

Object.getClass();

对象.class

Class.forName(“包名.类名”)

 

 

 

 

 

返回值:Constructor[]

 

返回值:Constructor

 

getConstructors()

所有public构造方法

getConstructor(Class…parameterTypes)

获取指定形参public方法

getDeclaredConstructors()

获取所有构造方法

getDeclaredConstructor(Class…parameterType)

获取指定形参构造方法

newInstance(Object... initargs)

用指定的初始化参数初始化该实例。

 

 

调用构造方法:

 *                 Constructor-->newInstance(Object... initargs)

con = clazz.getDeclaredConstructor(char.class);

System.out.println(con);

              //调用构造方法

con.setAccessible(true);//暴力访问(忽略掉访问修饰符)针对私有方法

obj = con.newInstance('男');

 

 

 

 

 

返回值:Field[]

 

返回值:Field

 

getFields()

获取public变量

getField(“variablename”)

获取指定public变量

getDeclaredField()

获取任意变量

getDeclaredField(“variablename”)

获取指定任意变 量

Field--àpublic void set(Object obj,Object value)

                   参数说明:

 *                               1.obj:要设置的字段所在的对象;

 *                               2.value:要为字段设置的值;

Field f = stuClass.getField("name");

System.out.println(f);

                     //获取一个对象

Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();

            // f.setAccessible(true);//暴力反射,如果涉及私有限定,解除私有限定。

                     //为字段设置值

f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"

                     //验证

Student stu = (Student)obj;

 

 

 

 

getMethods()

获取public方法

getMethod(String name,Class<?>... parameterTypes):

name : 方法名;

Class ...形参的Class类型对象

获取指定形参的public方法

getDeclaredMethods()

获取所有的成员方法

getDeclaredMethod(String name,Class<?>... parameterTypes)

获取指定形参所有成员方法

public Object invoke(Object obj,Object... args):

 *                               参数说明:

 *                               obj : 要调用方法的对象;

 *                               args:调用方式时所传递的实参

System.out.println("***************获取公有的show1()方法*******************");

              Method m = stuClass.getMethod("show1", String.class);

              System.out.println(m);

              //实例化一个Student对象

              Object obj = stuClass.getConstructor().newInstance();

              m.invoke(obj, "刘德华");

             

System.out.println("***************获取私有的show4()方法******************");

              m = stuClass.getDeclaredMethod("show4", int.class);

              System.out.println(m);

              m.setAccessible(true);//解除私有限定

              Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

              System.out.println("返回值:" + result);

 

 

 

 

 

反射main方法

 

 

 

//1、获取Student对象的字节码

                     Class clazz = Class.forName("fanshe.main.Student");

                    

                     //2、获取main方法

                      Method methodMain = clazz.getMethod("main", String[].class);//第一个参数:方法名称,第二个参数:方法形参的类型,

                     //3、调用main方法

                     // methodMain.invoke(null, new String[]{"a","b","c"});

                      //第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数

                      //这里拆的时候将  new String[]{"a","b","c"} 拆成3个对象。。。所以需要将它强转。

                      methodMain.invoke(null, (Object)new String[]{"a","b","c"});//方式一

                     // methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二

         

参考 https://blog.youkuaiyun.com/sinat_38259539/article/details/71799078

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值