文章插图
- 访问方法
- 根据方法名和参数列表获取Method方法对象:
Method m = 类的Class对象.getDeclaredMethod(方法名,XX.class);//得到本类的所有方法
XX.class指方法的参数对应的class
- 获取对象:Object o = 类的Class对象.newInstance();
- 爆破:m.setAccessible(true);
- 访问:Object returnValue = https://www.huyubaike.com/biancheng/m.invoke(o,实参列表);
- 注意:如果过是静态方法,则invoke的参数o可以写为null
- 根据方法名和参数列表获取Method方法对象:
例子:
package li.reflection;import java.lang.reflect.Method;//演示通过反射操作方法public class ReflectAccessMethod {public static void main(String[] args) throws Exception {//1.得到Boss类对应的Class对象Class<?> bossCls = Class.forName("li.reflection.Boss");//2.创建对象Object o = bossCls.newInstance();//3.调用普通的public的hi方法//3.1得到hi方法对应的方法对象Method hi = bossCls.getMethod("hi", String.class);//3.2调用hi.invoke(o, "孙悟空");//4.调用private static 方法//注意点:1.private:要使用爆破;2.static:在invoke时的参数可以写null//4.1得到 say 方法对象Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);//4.2爆破say.setAccessible(true);//4.3invoke的nullSystem.out.println(say.invoke(o, 100, "张三", '男'));System.out.println(say.invoke(null, 999, "李四", '女'));//因为是静态的方法,所以o可以写为null//5.在反射中,如果方法有返回值,统一返回Object,但其运行类型和方法定义的返回类型一致Object reVal = say.invoke(null, 300, "jack", '男');System.out.println("reVal的运行类型=" + reVal.getClass());//String}}class Boss {public int age;private static String name;public Boss() {}private static String say(int n, String s, char c) {//静态方法return n + " " + s + " " + c;}public void hi(String s) {//普通的public方法System.out.println("hi " + s);}}
文章插图
6.本章作业6.1练习1:通过反射修改私有成员变量
- 定义privateTest类,有私有属性name,并且属性值为"hellokitty"
- 提供getName的公有方法
- 创建PrivateTest的类,利用Class类的到私有属性name,修改其属性值,并调用getName()的方法打印name属性值
package li.reflection.homework;import java.lang.reflect.Field;import java.lang.reflect.Method;public class homework01 {public static void main(String[] args) throws Exception {//1.得到PrivateTest对应的Class对象Class<?> privateTestCls = Class.forName("li.reflection.homework.PrivateTest");//2.创建对象Object o = privateTestCls.newInstance();//3.得到name属性对象Field name = privateTestCls.getDeclaredField("name");//4.爆破name.setAccessible(true);name.set(o,"天龙八部");//5.得到getName方法的对象Method method = privateTestCls.getMethod("getName");//6.因为getName是public方法,直接调用即可Object invoke = method.invoke(o);System.out.println("name属性的值="+invoke);}}class PrivateTest{private String name = "HelloKitty";public String getName(){return name;}}
文章插图
6.2练习:利用反射和File完成以下功能
- 利用Class类的forName方法得到File类的class对象
- 在控制台打印File类的所有构造器
- 通过newInstance方法创建File对象,并创建d:\mynew.txt文件
提示:创建文件的正确写法如下:
File file = new File("d:\mynew.txt");
file.creatNewFile();
package li.reflection.homework;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class homework02 {public static void main(String[] args) throws Exception {//得到File类对应的class类对象Class<?> fileCls = Class.forName("java.io.File");//得到所有的构造器Constructor<?>[] declaredConstructors = fileCls.getDeclaredConstructors();System.out.println("=====File的所有构造器=====");//遍历输出构造器for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println(declaredConstructor);}//指定得到 public java.io.File(java.lang.String)Constructor<?> constructor = fileCls.getConstructor(String.class);//创建File类对象Object file = constructor.newInstance("d:\\mynew.txt");//获取createNewFile方法的对象Method createNewFile = fileCls.getDeclaredMethod("createNewFile");//调用createNewFile.invoke(file);}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Javascript 手写 LRU 算法
- Java 读写锁 ReadWriteLock 原理与应用场景详解
- 为什么阿里Java开发手册不推荐使用Timestamp
- 大华海康NVR录像JAVA下载及WEB播放
- 龙女反射弧是什么梗?
- 反射弧太长是什么意思?
- 反射弧有点长是什么梗?
- 反射弧短是什么意思?
- 环跳是哪里的反射区
- java和C语言的语法那个更复杂 java和c语言的区别是什么?