java-reflect 常用方法说明及实例
2015-01-03 15:07
483 查看
Class类的使用 java.lang.Class
1.1在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
1.2获取Class实例方式
方法1
利用对象调用getClass()方法获取该对象的Class实例;
方法2
使用Class类的静态方法forName(), 用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
方法3
运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,创建这个类的实例) Creates a new instance of the class represented by this Classobject.
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象 [1]
打印类的类信息
/**
* 打印类的信息,包含类的成员函、数成员变量
*/
public static void printClassMessage(Object obj) {
// 要获取类的信息 首先要获取类的类类型c
Class c = obj.getClass(); // 传递的是哪个子类的对象 c就是该子类的类类型
// 获取类的名字
System. out .println("类的名称是:" + c.getName());
/*
* Method类,方法对象 一个成员方法就是一个Method对象
* getMethod方法()获取所有public的函数,包括父类继承而来的方法。
* getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] ms = c.getDeclaredMethods();
for (Method method : ms) {
Class returnType = method.getReturnType();// 得到方法的返回值类型的类类型
System. out .println(returnType.getName() + " ");
System. out .print(method.getName());// 得到方法名称
StringBuilder paramStr = new StringBuilder();
Class[] paramTypes = method.getParameterTypes();// 获取参数类型-->得到的是参数列表的类型的类类型
if (paramTypes != null && paramTypes. length > 0) {
paramStr.append( "(" );
for (Class type : paramTypes) {
paramStr.append(type.getName() + "," );
}
paramStr.deleteCharAt(paramStr.length() - 1);
paramStr.append( ")" );
} else {
paramStr.append( "()" );
}
System. out .println(paramStr.toString());
/*
* 成员变量也是对象java.lang.reflect.Field Field类封装了关于成员变量的操作
* getFields获取所有的public的成员变量的信息 getDeclaredFields()获取该类自己声明的成员变量的信息
*/
Field[] fs = c.getDeclaredFields();
if (fs != null && fs. length > 0) {
for (Field field : fs) {
// 得到成员变量的类型的类类型
Class fType = field.getType();
System. out .println(fType.getName() + ":" + field.getName());
}
}
/*
* 构造函数也是对象 java.lang.Constructor中封装了构造函数的信息
* c.getDeclaredConstructors() 得到所有自己声明的构造方法
*/
Constructor[] cs = c.getDeclaredConstructors();
System. out .println(cs.length );
if (cs != null && cs. length > 0) {
StringBuilder csStr = new StringBuilder();
for (Constructor constructor : cs) {
csStr.append(constructor.getName());
csStr.append( "(" );
Class[] ctypes = constructor.getParameterTypes();
if (ctypes != null && ctypes.length > 0) {
for (Class type : ctypes) {
csStr.append(type.getName() + "," );
}
csStr.deleteCharAt(csStr.length() - 1);
}
csStr.append( ")" );
}
System. out .println(csStr.toString());
}
}
}
1.3方法的反射
1)如何获取某个方法?
方法名和方法的参数列表才能唯一的决定某个方法
2)方法反射的操作
method.invoke(对象,参数列表)
实例:
public static void main(String[]
args) {
[align=left] //如何获取指定print方法,1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类对象[/align]
[align=left] Class c = A. class;[/align]
[align=left] /*[/align]
[align=left] *2.获取方法 名称和参数列表来决定唯一的方法[/align]
*class...或者 int...等等
代表的意思是需要1个或多个参数,可以传递new Class[]{X,X,X}或者x,x,x这两种类型的参数
[align=left] *getMethod获取的是public的方法[/align]
[align=left] *getDeclaredMethod获取的是自己声明的方法[/align]
[align=left] */[/align]
[align=left] try {[/align]
[align=left] Method method = c.getDeclaredMethod( "print", int. class , int. class) ;[/align]
[align=left] method.invoke(c.newInstance(), 1,1); //方法的反射操作,通过方法来操作类去执行。[/align]
[align=left] [/align]
[align=left] Method method1 = c.getDeclaredMethod( "print", new Class[]{String. class ,String.class });[/align]
[align=left] method1.invoke(c.newInstance(), "hello" ,"World" );//方法的反射操作,通过方法来操作类去执行。[/align]
} catch (Exception
e) {
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] }[/align]
class A
{
[align=left] [/align]
[align=left] public void print(int a, int b){[/align]
[align=left] System. out .println(a+b);[/align]
[align=left] }[/align]
[align=left] [/align]
public void print(String
a,String b){
[align=left] System. out .println(a+b);[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]1.4通过反射了解集合泛型的本质[/align]
[align=left] List a = new ArrayList ();[/align]
[align=left] List<String> b = new ArrayList<String>();[/align]
[align=left] [/align]
[align=left] Class ca = a.getClass();[/align]
[align=left] Class cb = b.getClass();[/align]
[align=left] //看看list集合的类对象是否相同[/align]
[align=left] System. out .println(ca==cb);[/align]
[align=left] /*[/align]
[align=left] *返回结果为true,虽然2个集合的泛型不同,但是类的类对象相同[/align]
[align=left] *也说明Java中集合的泛型,是防止错误输入的只在编译阶段有效,绕过编译就无效了。[/align]
[align=left] *验证:方法的反射来操作,绕过编译[/align]
[align=left] */[/align]
[align=left] try {[/align]
Method m = cb.getMethod( "add",
Object.class );
[align=left] m.invoke(b, 100);[/align]
[align=left] System. out .println(b.size());[/align]
[align=left] System. out .println(b);[/align]
for (int i
= 0; i < b.size(); i++) {
[align=left] Object obj = b.get(i);[/align]
[align=left] System. out .println(obj);[/align]
[align=left] }[/align]
} catch (Exception
e) {
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
1.1在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
1.2获取Class实例方式
方法1
利用对象调用getClass()方法获取该对象的Class实例;
方法2
使用Class类的静态方法forName(), 用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
方法3
运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,创建这个类的实例) Creates a new instance of the class represented by this Classobject.
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象 [1]
打印类的类信息
/**
* 打印类的信息,包含类的成员函、数成员变量
*/
public static void printClassMessage(Object obj) {
// 要获取类的信息 首先要获取类的类类型c
Class c = obj.getClass(); // 传递的是哪个子类的对象 c就是该子类的类类型
// 获取类的名字
System. out .println("类的名称是:" + c.getName());
/*
* Method类,方法对象 一个成员方法就是一个Method对象
* getMethod方法()获取所有public的函数,包括父类继承而来的方法。
* getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] ms = c.getDeclaredMethods();
for (Method method : ms) {
Class returnType = method.getReturnType();// 得到方法的返回值类型的类类型
System. out .println(returnType.getName() + " ");
System. out .print(method.getName());// 得到方法名称
StringBuilder paramStr = new StringBuilder();
Class[] paramTypes = method.getParameterTypes();// 获取参数类型-->得到的是参数列表的类型的类类型
if (paramTypes != null && paramTypes. length > 0) {
paramStr.append( "(" );
for (Class type : paramTypes) {
paramStr.append(type.getName() + "," );
}
paramStr.deleteCharAt(paramStr.length() - 1);
paramStr.append( ")" );
} else {
paramStr.append( "()" );
}
System. out .println(paramStr.toString());
/*
* 成员变量也是对象java.lang.reflect.Field Field类封装了关于成员变量的操作
* getFields获取所有的public的成员变量的信息 getDeclaredFields()获取该类自己声明的成员变量的信息
*/
Field[] fs = c.getDeclaredFields();
if (fs != null && fs. length > 0) {
for (Field field : fs) {
// 得到成员变量的类型的类类型
Class fType = field.getType();
System. out .println(fType.getName() + ":" + field.getName());
}
}
/*
* 构造函数也是对象 java.lang.Constructor中封装了构造函数的信息
* c.getDeclaredConstructors() 得到所有自己声明的构造方法
*/
Constructor[] cs = c.getDeclaredConstructors();
System. out .println(cs.length );
if (cs != null && cs. length > 0) {
StringBuilder csStr = new StringBuilder();
for (Constructor constructor : cs) {
csStr.append(constructor.getName());
csStr.append( "(" );
Class[] ctypes = constructor.getParameterTypes();
if (ctypes != null && ctypes.length > 0) {
for (Class type : ctypes) {
csStr.append(type.getName() + "," );
}
csStr.deleteCharAt(csStr.length() - 1);
}
csStr.append( ")" );
}
System. out .println(csStr.toString());
}
}
}
1.3方法的反射
1)如何获取某个方法?
方法名和方法的参数列表才能唯一的决定某个方法
2)方法反射的操作
method.invoke(对象,参数列表)
实例:
public static void main(String[]
args) {
[align=left] //如何获取指定print方法,1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类对象[/align]
[align=left] Class c = A. class;[/align]
[align=left] /*[/align]
[align=left] *2.获取方法 名称和参数列表来决定唯一的方法[/align]
*class...或者 int...等等
代表的意思是需要1个或多个参数,可以传递new Class[]{X,X,X}或者x,x,x这两种类型的参数
[align=left] *getMethod获取的是public的方法[/align]
[align=left] *getDeclaredMethod获取的是自己声明的方法[/align]
[align=left] */[/align]
[align=left] try {[/align]
[align=left] Method method = c.getDeclaredMethod( "print", int. class , int. class) ;[/align]
[align=left] method.invoke(c.newInstance(), 1,1); //方法的反射操作,通过方法来操作类去执行。[/align]
[align=left] [/align]
[align=left] Method method1 = c.getDeclaredMethod( "print", new Class[]{String. class ,String.class });[/align]
[align=left] method1.invoke(c.newInstance(), "hello" ,"World" );//方法的反射操作,通过方法来操作类去执行。[/align]
} catch (Exception
e) {
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] }[/align]
class A
{
[align=left] [/align]
[align=left] public void print(int a, int b){[/align]
[align=left] System. out .println(a+b);[/align]
[align=left] }[/align]
[align=left] [/align]
public void print(String
a,String b){
[align=left] System. out .println(a+b);[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]1.4通过反射了解集合泛型的本质[/align]
[align=left] List a = new ArrayList ();[/align]
[align=left] List<String> b = new ArrayList<String>();[/align]
[align=left] [/align]
[align=left] Class ca = a.getClass();[/align]
[align=left] Class cb = b.getClass();[/align]
[align=left] //看看list集合的类对象是否相同[/align]
[align=left] System. out .println(ca==cb);[/align]
[align=left] /*[/align]
[align=left] *返回结果为true,虽然2个集合的泛型不同,但是类的类对象相同[/align]
[align=left] *也说明Java中集合的泛型,是防止错误输入的只在编译阶段有效,绕过编译就无效了。[/align]
[align=left] *验证:方法的反射来操作,绕过编译[/align]
[align=left] */[/align]
[align=left] try {[/align]
Method m = cb.getMethod( "add",
Object.class );
[align=left] m.invoke(b, 100);[/align]
[align=left] System. out .println(b.size());[/align]
[align=left] System. out .println(b);[/align]
for (int i
= 0; i < b.size(); i++) {
[align=left] Object obj = b.get(i);[/align]
[align=left] System. out .println(obj);[/align]
[align=left] }[/align]
} catch (Exception
e) {
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
相关文章推荐
- java.lang.Object常用方法实例代码
- Java的SimpleDateFormat常用方法说明整理
- Java 的swing.GroupLayout布局管理器的使用方法和实例【图文说明】
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
- Java.lang.reflect.Method invoke方法 实例
- 实例说明java中覆盖静态方法和非静态方法的不同
- java中Map集合的常用遍历方法及HashMap的应用实例
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- Java中的实例方法、静态方法和数据域的覆盖和隐藏说明
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- Java的常用方法说明
- 实例说明java中覆盖静态方法和非静态方法的不同
- java中Map集合的常用遍历方法及HashMap的应用实例
- Java.lang.reflect.Method invoke方法 实例
- Java的SimpleDateFormat常用方法说明整理
- Java的SimpleDateFormat常用方法说明整理
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- JAVA并发库之Executors常用的创建ExecutorService的几个方法说明