反射:reflect(二)
来源:互联网 发布:时光倒流软件 编辑:程序博客网 时间:2024/05/19 22:26
-
反射:reflect
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也是用一个个Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的实例对象来表示,他们是Field、Method、Contructor、Package、等。
反射:程序的运行时期,对一个类的字节码文件(class)进行解剖,解剖后,看到字节码文件中定义的内容、成员方法、成员变量、构造方法可以运行这个方法,成员变量。、
简单来说:编译时期不知道运行谁,运行时期也不知道运行谁,运行的类和方法,由用户指定。
反射相关的东西—类
Java是面向对象的语言,class文件也是对象,有一个类,描述这个class文件的,java.lang.Class。
构造方法也是一个对象,Constructor类。
成员方法也是一个对象,Method类。
成员变量也是一个对象,Filed类。
获取到一个类的字节码文件对象
getClass()
类名.class
Class.forName()
获取字节码文件中的构造方法,并运行
getConstructor(参数)获取构造方法。
getConstructors()获取所有public的构造方法,存储数组。
getDeclaredConstructor(参数)获取所有的构造方法,非public。
Constructor类的 newInstance()运行获取到的构造方法。
获取成员方法并运行
getMethods()获取成员方法,存储数组。
getMethod(方法名,参数列表)。
getDeclaredMethod(方法名,参数列表)。
Method类的 invoke(对象,方法的参数)。
实例:
[java] view plaincopyprint?01.public class Person { 02. public Person(int x) { 03. 04. } 05. 06. public Person(String s) { 07. this.name = s; 08. } 09. 10. private Person() { 11. 12. } 13. 14. public String name; 15. private int age; 16. 17. public void show() { 18. System.out.println(name + ":::show:::" + age); 19. } 20. 21. public void show(int x) { 22. System.out.println(name + ":::show:::" + age + x); 23. 24. } 25. 26. private void method() { 27. System.out.println("private method"); 28. } 29. 30. public String toString() { 31. return "Person...toString" + name; 32. } 33.}
获取字节码文件对象:
[java] view plaincopyprint?01./* 02. * 获取字节码文件对象 03. */ 04.public class ReflectDemo1 { 05. public static void main(String[] args) throws Exception { 06. method(); 07. } 08. 09. // 获取字节码文件对象 10. private static void method() throws Exception { 11. // 第一种方式,通过对象获取,对象的getClass方法 12. // Person p = new Person(); 13. // public final Class<?> getClass() Person.class字节码文件对象 14. // Class c = p.getClass(); 15. // System.out.println(c); 16. 17. // 第二种方法,通过Person类直接获取,任意的数据类型,都有一个静态属性class返回字节码文件对象 18. Class c1 = Person.class; 19. // System.out.println(c==c1);//T 20. // System.out.println(c.equals(c1));//T 21. 22. // 第三种方法,使用Class类中的静态方法 forName(String 类名) 23. Class c2 = Class.forName("cn.itcast.reflect.Person"); 24. System.out.println(c2); 25. System.out.println(c1 == c2); 26. } 27. 28.}
获得构造方法,运行
[java] view plaincopyprint?01.import java.lang.reflect.*; 02. 03./* 04. * 获得构造方法,运行 05. */ 06.public class ReflectDemo2 { 07. public static void main(String[] args) throws Exception { 08. method(); 09. } 10. 11. private static void method() throws Exception { 12. // 获得字节码文件对象 13. Class clazz = Class.forName("cn.itcast.reflect.Person"); 14. // public Constructor<?>[] getConstructors() 获取构造方法,存储成数组,构造方法public权限 15. Constructor[] con = clazz.getConstructors(); 16. for (Constructor c : con) { 17. System.out.println(c); 18. } 19. // Constructor<T> getConstructor(Class<?>... parameterTypes) 20. // 带有一个String类型参数的构造方法 21. Constructor c = clazz.getConstructor(String.class); 22. // 运行构造方法 public T newInstance(Object... initargs) 23. Object obj = c.newInstance("我是谁"); 24. System.out.println(obj); 25. 26. // 获取私有构造方法并运行 27. Constructor con1 = clazz.getDeclaredConstructor(); 28. System.out.println("----" + con1); 29. con1.setAccessible(true);// 暴力访问 30. Object obj1 = con1.newInstance(); 31. System.out.println(obj1); 32. 33. } 34. 35.}
- 反射:reflect(二)
- 反射机制(Reflect)
- 反射(reflect)
- Java反射(reflect)
- 反射(Reflect)
- 反射(reflect)
- java 反射(reflect)
- golang 反射(reflect)
- java强化篇(二)---反射(Reflect)
- Java反射机制学习(二)java.lang.reflect.Array
- 反射小结(二)之 java.lang.reflect.Type
- 关于反射机制(Reflect)
- java 反射(Reflect)1
- java 反射(Reflect)2
- Java反射技术(Reflect)
- Java反射机制(Reflect)
- 反射reflect
- 反射reflect
- (C++实现)——原型模式(Prototype Pattern)
- Git学习笔记02-- 初次运行 Git 前的配置
- springmvc 拦截器配置
- 使用ASIFormDataRequest处理post请求
- 驱动工程师面试题汇编
- 反射:reflect(二)
- htpasswd.cgi 网页远程修改gerrit HTTP认证的密码文件
- (C++实现)——适配器模式(Adapter Pattern)
- 解决:win8 更改计算机全名 文档“被另一用户锁定” microsoft office无法打开
- OCP-1Z0-051-V9.02-93题
- 排序算法总结(七)冒泡排序
- (C++实现)——组合模式(Composite Pattern)
- 图像金字塔L-K光流法模型的学习
- PXE+DHCP+Apache+Kickstart自动安装CentOS