一、獲得各個字節碼對應的實例對象(Class類型)的三種方式,示例以下:java
類名.class,好比,System.classthis
對象.getClass(),好比,new Date().getClass()spa
Class.forName("類名"),好比,Class.forName("java.util.Date")code
二、Constructor類的使用,Constructor類表明某個類中的一個構造方法對象
獲得某個類全部的構造方法:blog
Constructor[] constructors=Class.forName("java.lang.String").getConstructors();get
獲得某一個構造方法:io
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);class
建立實例對象:變量
普通方式:
String str=new String(new StringBuffer("abc"));
使用反射:
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
String str1=(String) constructor.newInstance(new StringBuffer("abc"));
直接使用Class.newInstance()方法:
String str2=(String)Class.forName("java.lang.String").newInstance();
該方法內部是先獲得默認的構造方法,而後用該構造方法建立對象實例
三、Field類表明某個類中的一個成員變量,使用方法以下:
class Point{ public int x; private int y; public Point() {} public Point(int x,int y){ this.x=x; this.y=y; } } public class Demo01 { public static void main(String[] args) throws Exception { Point point=new Point(1,2); Field xField=Class.forName("com.ly.java.enhance.reflection.Point").getField("x"); System.out.println(xField.get(point));
//獲得私有屬性 Field yField=Class.forName("com.ly.java.enhance.reflection.Point").getDeclaredField("y"); yField.setAccessible(true); System.out.println(yField.get(point)); } }
四、Method類表明某個類中的一個成員方法,使用方法以下:
獲得類中的某一個方法:
Method charAt=Class.forName("java.lang.String").getMethod("charAt", int.class);
調用類中的某一個方法:
String str="abc";
普通方式:System.out.println(str.charAt(1));
使用反射:
Method charAt=Class.forName("java.lang.String").getMethod("charAt", int.class); System.out.println(charAt.invoke(str, 1));