Java反射知识点总结

来源:互联网 发布:淘宝互刷平台源码 编辑:程序博客网 时间:2024/06/04 18:31

一、常用的方法

1、加载一个类

Class clazz = Class.forName("com.lei.test.HelloWorld");

里面的参数为全路径:包名.类名

2、获得构造方法对象

Constructor constructor = clazz.getConstructor();

获得指定的构造方法

Constructor constructor2 = clazz.getDeclaredConstructor(String.class);

3、生成类的实例

①生成默认构造方法的实例

Object obj = constructor.newInstance();

②生成带参数的构造方法实例

Object obj3 = constructor2.newInstance("测试");

③快捷生成实例(默认构造方法)

Object obj2 = clazz.newInstance();

4、得到类的字段

①得到类的公共字段

Field field = clazz.getField("name");

//通过实例关联此字段对象
Object name = field.get(obj);
System.out.println(name);


②得到类的私有字段

Field field2 = clazz.getDeclaredField("age");
//强制设置访问权限(不设置会出错)异常:java.lang.IllegalAccessException
field2.setAccessible(true);
//关联实例
Object age = field2.get(obj);
System.out.println(age);


③为字段重新赋值

field2.set(obj, 66);
age = field2.get(obj);
System.out.println(age);

5、调用类的方法

①调用公共无参方法

Method method = clazz.getMethod("print", null);
//绑定, 执行当前的方法并将相应的实际参数传递
method.invoke(obj, null);


②调用私用有参方法

Method method2 = clazz.getDeclaredMethod("print", String.class,int.class);
//强制设置访问权限(不设置会出错)异常:java.lang.IllegalAccessException
method.setAccessible(true);
//绑定, 执行当前的方法并将相应的实际参数传递

method.invoke(obj,"年龄",20);


二、代码展示

ReflectTest.java

package com.lei.test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * 反射示例 * Author: pibigstar * Created on: 2017年8月27日 下午7:01:47 */public class ReflectTest {public static void main(String[] args) throws Exception {/**=============普通生成实例=====================*///HelloWorld hello = new HelloWorld();  这一句话就等于下面 1 2 3 步的总和/**=============通过反射生成实例================*///1.获得字节码对象  Class.forName()Class clazz = Class.forName("com.lei.test.HelloWorld");//2.获得构造实例 ,没有参数则返回默认的构造方法,根据参数的不同返回不同的构造方法 参数为String.class这样Constructor constructor = clazz.getConstructor();//3.生成实例Object obj = constructor.newInstance();//快捷方式。。。。返回默认构造方法生成的实例//Object obj2 = clazz.newInstance();//获得一个指定的Constructor对象//Constructor constructor2 = clazz.getDeclaredConstructor(String.class);//Object obj3 = constructor2.newInstance("测试");/**=========普通方式操作类里面的成员变量=============*///System.out.println(hello.name);/**===========通过反射操作得到类成员===============*///获得类的公共字段的对象 public String nameField field = clazz.getField("name");//通过实例关联此字段对象Object name = field.get(obj);System.out.println(name);//获得类的私有字段的对象 private Integer ageField field2 = clazz.getDeclaredField("age");//强制设置访问权限(不设置会出错)异常:java.lang.IllegalAccessExceptionfield2.setAccessible(true);//关联实例Object age = field2.get(obj);System.out.println(age);//设置值field2.set(obj, 66);age = field2.get(obj);System.out.println(age);/**===========普通方式调用类里面的方法=========*///hello.print();/**=========通过反射调用类里面的方法==========*///获得方法public void print()//方法没有参数就写null或者不写clazz.getMethod("print");Method method = clazz.getMethod("print", null);//绑定, 执行当前的方法并将相应的实际参数传递method.invoke(obj, null);//获得方法public void print(String str,int i)  //注意:这里之所以写int.class是因为我们直接对字节码进行操作将自动装箱绕过去了Method method2 = clazz.getDeclaredMethod("print", String.class,int.class);//强制设置访问权限(不设置会出错)异常:java.lang.IllegalAccessExceptionmethod.setAccessible(true);//绑定, 执行当前的方法并将相应的实际参数传递method.invoke(obj,"年龄",20);}}


HelloWorld.java


package com.lei.test;public class HelloWorld{public HelloWorld() {System.out.println("默认构造方法");}public HelloWorld(String name){System.out.println("其他构造方法"+name);}public String name = "派大星";private Integer age = 20;public void print(){System.out.println("打印输出");}private void print(String str,int i){System.out.println(str + ":" + i);}}



原创粉丝点击