java进阶三:反射
1、得到各个字节码对应的实例对象(Class类型)的三种方式,示例如下:
类名.class,比如,System.class
对象.getClass(),比如,new Date().getClass()
Class.forName("类名"),比如,Class.forName("java.util.Date")
2、Constructor类的使用,Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
Constructor[] constructors=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.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();
该方法内部是先得到默认的构造方法,然后用该构造方法创建对象实例
3、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)); } }
4、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));