本文共 9871 字,大约阅读时间需要 32 分钟。
Class a
public class MyClass { }
Class classInstance= MyClass.class;
二. 通过类创建的实例对象的getClass方法取得
MyClass myClass = new MyClass();Class classInstance = myClass.getClass();
三.通过Class类的静态方法forName方法取得(参数是带包名的完整的类名)
Class classInstance = Class.forName("mypackage.MyClass");
try { Class classInstance = Class.forName("mypackage.MyClass");} catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();}
public class MyClass { private int value; //成员变量 public MyClass (int value) { this.value = value; } //构造函数 public int getValue() { return value; } //方法1 public void setValue(int value) { this.value = value; } //方法2}
import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method; public class Test { public static void printClassMessage (Object obj) { Class c = obj.getClass(); // 获取obj所属类的Class对象 Method [] methods = c.getDeclaredMethods(); // 获取方法对象列表 System.out.println("遍历MyClass类里的所有方法的名称:"); for(int i =0; i
遍历MyClass类里的所有方法的名称:getValuesetValue遍历MyClass类里的所有成员变量的名称:value遍历MyClass类里的所有构造函数的名称:mypackage.MyClass
上面的例子仅仅是作为一个展示,Method/Field/Constructor对象的API当然不仅限于getName这样获取名称的简单操作,所以接下来我将分别介绍更具体的反射API
getValuesetValue
import java.lang.reflect.Method; public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); Method [] methods = c.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } } public static void main(String [] args) { MyClass myClass = new MyClass(1); printMethodsMessage(myClass); }}
getValuesetValuewaitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll
import java.lang.reflect.Method; public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所属类对应的Class对象 Method [] methods = c.getDeclaredMethods(); // 取得obj所属类中方法对应的Method对象组成的数组 for (Method method : methods) { // 遍历Method对象 String name = method.getName(); // 取得方法名 Class returnClass = method.getReturnType(); // 获取方法返回值对应的Class对象 String returnName = returnClass.getName(); //获取返回值所属类的类名——也即返回值类型 System.out.println(name + "方法的返回值类型是" + returnName); } } public static void main(String [] args) { MyClass myClass = new MyClass(1); printMethodsMessage(myClass); } }
getValue方法的返回值类型是intsetValue方法的返回值类型是void
public class MyClass { public void method1 (int a, long b) { }; public void method2 (float a, double b) { }; public void method3 (String str) { };}
public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所属类对应的Class对象 Method [] methods = c.getDeclaredMethods(); // 取得obj所属类中方法对应的Method对象组成的数组 for (Method method : methods) { // 遍历Method对象 String methodName = method.getName(); // 取得方法名 String paramsStr = ""; // 用于存放某个方法参数类型列表的字符串 Class [] paramsClasses = method.getParameterTypes(); for (Class pc: paramsClasses) { String paramStr = pc.getName(); // 获取当前参数类型 paramsStr+=paramStr + " "; } System.out.println(methodName+ "方法的所有参数的类型列表:" + paramsStr); } } public static void main(String [] args) { MyClass myClass = new MyClass(); printMethodsMessage(myClass); }}
method2方法的参数类型列表:float double method1方法的参数类型列表:int long method3方法的参数类型列表:java.lang.String
public class MyClass { private int number = 123; private String name ="彭湖湾";}
import java.lang.reflect.Field;import java.lang.reflect.Method; public class Test { public static void printFieldsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所属类对应的Class对象 try { Field field = c.getDeclaredField("name"); // 取得名称为name的field对象 field.setAccessible(true); // 这一步很重要!!!设置为true才能访问私有成员变量name的值! String nameValue = (String) field.get(obj); // 获取obj中name成员变量的值 System.out.println("MyClass类中name成员变量的值为:" + nameValue); // 输出 } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String [] args) { MyClass myClass = new MyClass(); printFieldsMessage(myClass); } }
MyClass类中name成员变量的值为:彭湖湾
Field field = class1.getDeclaredField(number");System.out.print(field.getType().getName());
int
public class MyClass { public MyClass(int a, String str){}}
import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method; public class Test { public static void printContructorsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所属类对应的Class对象 Constructor [] constructors = c.getDeclaredConstructors(); for (Constructor constructor : constructors) { Class [] paramsClasses = constructor.getParameterTypes(); String paramsStr = ""; for (Class pc : paramsClasses) { String paramStr = pc.getName(); paramsStr+=paramStr + " "; } System.out.println("构造函数的所有参数的类型列表:" + paramsStr); } } public static void main(String [] args) { MyClass myClass = new MyClass(1, "彭湖湾"); printContructorsMessage(myClass); } }
构造函数的所有参数的类型列表:int java.lang.String
NotExistClass cannot be resolved to a type
Class classInstance = Class.forName("mypackage.MyClass");MyClass myClass = (MyClass) classInstance.newInstance();
public class Test { public static void main(String [] args) { try { Class classInstance = Class.forName("mypackage.MyClass"); MyClass myClass = (MyClass) classInstance.newInstance(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
转载地址:http://kucmx.baihongyu.com/