学会了实例分析 Java 反射吗
反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特性。 什么是反射 java的反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象。 基本形式 public void execute(String className, String methodName) throws Exception { Class clazz = Class.forName(className); clazz.getMethod(methodName).invoke(clazz.newInstance()); } 上面的例子中,我演示了几个在反射里极为重要的方法:获取类的方法: forName实例例化类对象的方法: newInstance获取函数的方法: getMethod执行函数的方法: invoke。 反射的作用: 让Java具有动态性,修改已有对象的属性,动态生成对象,动态调用方法,操作内部类和私有方法。 在反序列化漏洞中的应用 定制需要的对象,通过invoke调用除了同名函数以外的函数,通过class类创建对象,引入不能序列化的类。 java反射举例 此处引用白日梦组长的例子,具体讲解一下反射。 先写一个Person作为我们下面演示的原型类。 public class Person { private String name; public int age; public void act(){ System.out.println("test"); } @Override public String toString() { return "Persion{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } } 获取原型类 使用forName方法: Class c = Class.forName("Person"); 在此也写一种基于ClassLoader的动态类加载方式。 this.getClass().getClassLoader().loadClass("Person"); 从原型class里面实例化对象 利用构造函数实例化。 Constructor constructor = c.getConstructor(String.class,int.class); Person p1 = (Person) constructor.newInstance("abc",22); 我们来逐行写一下分析: Constructor constructor = c.getConstructor(String.class,int.class); 这一行是为了获取原型类中重载的构造方法 public Person(String name, int age) { this.name = name; this.age = age; } 对构造方法进行传参实例化一个对象 Person p1 = (Person) constructor.newInstance("abc",22); 我们可以打印一下p1看一下返回结果 获取类里面的属性 private String name; public int age; public Field ageField = c.getField("age"); ageField.set(p1,11); private Field nameField = c.getDeclaredField("name"); nameField.setAccessible(true); nameField.set(p1,"xinyuan"); 获取类方法 Method actmethod = c.getMethod("act",String.class); actmethod.invoke(p1,"SKyMirror"); getMethod 与上面的获取构造函数类似,第一个参数是函数名,第二个是传参的类型。 invoke方法第一个传入对象,第二个是传入参数值。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |