在反射中,可以使用Class对象的isInstance() 方法来判断是否为某个类的实例,这是一个native方法
public native boolean isInstance(Object obj); 创建实例通过反射生成对象的实例主要有两种方式:
使用Class对象的newInstance()方法来创建Class对象对应类的实例:
Class<?> c = String.class; Object str = c.newInstance();先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例: 可以用指定的构造器构造类的实例
/* 获取String所对应的Class对象 */ Class<?> c=String.class; /* 获取String类带一个String参数的构造器 */ Constructor constructor=c.getConstructor(String.class); /* 根据构造器创建实例 */ Object obj=constructor.newInstance("abc"); System.out.println(obj); 获取方法获取Class对象的方法集合,主要有三种方法:
getDeclaredMethods(): 返回类或接口声明的所有方法:
包括公共,保护,默认(包)访问和私有方法
不包括继承的方法
public Method[] getDeclaredMethods() throws SecurityException {}getMethods(): 返回某个类所有的public方法
包括继承类的public方法
public Method[] getMethods() throws SecurityException {}getMethod(): 返回一个特定的方法
第一个参数 :方法名称
后面的参数 :方法的参数对应Class的对象
public Method getMethod(String name,Class<?>... parameterType) {}获取方法示例:
public class MethodTest { public static void methodTest() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class<?> c = methodClass.class; Object object = c.newInstance(); Method[] methods = c.getMethods(); Method[] declaredMethods = c.getDeclaredMethods(); // 获取methodClass类中的add方法 Method method = c.getMethod("add", int.class, int.class); // getMethods()方法获取的所有方法 System.out.println("getMethods获取的方法:"); for (Method m:methods) System.out.println(m); // getDeclaredMethods()方法获取的所有方法 System.out.println("getDeclaredMethods获取的方法:"); for (Method m:declaredMethods) System.out.println(m); } } class methodClass { public final int n = 3; public int add(int a, int b) { return a + b; } public int sub(int a, int b) { return a * b; } }程序运行结果:
getMethods获取的方法: public int org.ScZyhSoft.common.methodClass.add(int,int) public int org.ScZyhSoft.common.methodClass.sub(int,int) public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() getDeclaredMethods获取的方法: public int org.ScZyhSoft.common.methodClass.add(int,int) public int org.ScZyhSoft.common.methodClass.sub(int,int)通过getMethods() 获取的方法可以获取到父类的方法
获取构造器信息通过Class类的getConstructor方法得到Constructor类的一个实例
Constructor类中newInstance方法可以创建一个对象的实例:
public T newInstance(Objec ... initargs)newInstance方法可以根据传入的参数来调用对应的Constructor创建对象的实例
获取类的成员变量信息getFileds: 获取公有的成员变量
getDeclaredFields: 获取所有已声明的成员变量,但是不能得到父类的成员变量
调用方法