反射机制(二)
来源:互联网 发布:url scheme windows 编辑:程序博客网 时间:2024/06/14 18:23
获取类有如下三种方法
1 通过类的class属性,如 Class clazz=Class.class;
2 通过实例对象的getClass方法,如:Class clazz=new Date().getClass();
3 通过Class.forName(),如 :Class clazz =Class.forName(“java.lang.String”);
获取对象实例
通过Class实例的newInstance(),如:String str=(String)clazz.newInstance();
Class类代表Java类,它的各个实例对象又分别对应什么?
对应着各个类在内存中的字节码,Person类的字节码 ArrayList的字节码
一个类被类加载器加载到内存中,占用一片存储空间,不同的类的字节码是不同,故在内存中的内容也是不同的。这空间用对象表示,类型是class
Constructor类
表示某个类中的一个构造方法
得到某个类的所有的构造方法:
Constructor co[]=Class.forName(“java.lang.String”).getConstructors();
得到某一个构造方法
Costructor con=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象
通常方式:String str=new String(new StringBuffer(“abc”));
反射方式:String str=(String)con.newInstance(new StringBuffer(“abc”));
调用获得的方法时要用到上面相同类型的实例对象
Class.newInstance()方法
String obj=(String)Class.forName(“java.lang.String”).newInstance();
该方法的内部先得到默认的构造方法,然后用该构造方法创建实例对象。
Field类
代表了某个类中的每一个成员变量
示例代码:
ReflectPoint point = new ReflectPoint(1,7); Field y = Class.forName(".corejava.ReflectPoint").getField("y"); System.out.println(y.get(point)); //Field x = Class.forName(".corejava.ReflectPoint").getField("x"); Field x = Class.forName(".corejava.ReflectPoint").getDeclaredField("x"); x.setAccessible(true); System.out.println(x.get(point));
Method类
代表某个类中的一个成员方法
得到类中的某一个方法:
例子:Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”, int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str, 1));
如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!
public class Person { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("net.xsoftlab.baike.Person"); // 调用Person类中的run方法 Method method = clazz.getMethod("run"); method.invoke(clazz.newInstance()); // Java 反射机制 - 调用某个类的方法1. // 调用Person的Speak方法 method = clazz.getMethod("Speak", int.class, String.class); method.invoke(clazz.newInstance(), 22, "小明"); // Java 反射机制 - 调用某个类的方法2. // age -> 22. name -> 小明 } public void run(){ System.out.println("调用Person类的run方法"); } public void Speak(int age, String name){ System.out.println("调用Person类的Speak方法"); System.out.println("age -> " + age + ". name -> " + name); } }
参考博客:
http://blog.sina.com.cn/s/blog_6b7d710b0102wgnb.html
- 反射机制(二)
- C#反射机制(二)
- Java反射机制(二)
- java反射机制(二)
- Python 反射机制(二)
- Java反射机制(二)
- JAVA反射机制(二)
- android反射机制(二)
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- java的method反射机制(二)
- 通俗易懂解释java反射机制(二)
- Java学习 反射机制(二)
- 黑马程序员—反射机制(二)
- java基础知识(二)--反射机制
- Java反射机制梳理(二)
- 初识 java 反射机制 (二)
- 【OpenGL】中点法画椭圆
- Hbase 技术细节笔记(上)
- 小沙龙之大咖小聚——企业服务生态联盟线下沙龙
- 【软件网每日新闻播报│第9-25期】
- IMAPP的下载与配置
- 反射机制(二)
- 【软件网每日新闻播报│第9-20期】
- eclipse butterknife 不生效问题
- LoRa建网大军最新动态
- SpringBoot+FastJson 中文乱码问题
- 挚友诚达:协同的前景、致远互联的态度,让伙伴更放心
- 海尔会成为最大的智联网企业么?
- 2017年全球大数据产业报告之海外篇(第六集)
- 壮大云平台中国力量 安全可控大会即将登场