Java反射机制总结二
2016-11-22 18:54
453 查看
当我们获取到Class对象的时候,就可以用来获取Class的完整结构,包括构造器,属性,方法和其他的一些信息(父类,包名,接口等信息)。
person.java:
Biont.java:
person.java:
package com.tuxianchao; import java.util.Comparator; public class Person extends com.tuxianchao.Biont<String> implements Comparator<Person> { int id; private String name; public int age; public Person() { System.out.println("空参构造器..."); } public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() throws Exception { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void method(String nation) { System.out.println("我的国籍是:" + nation); } public void method() { System.out.println("我是" + name); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } // 内部类,语言 class Language { String LanguageName; String LanguageLocation; public Language() { } public Language(String languageName, String languageLocation) { LanguageName = languageName; LanguageLocation = languageLocation; } public String getLanguageName() { return LanguageName; } public void setLanguageName(String languageName) { LanguageName = languageName; } public String getLanguageLocation() { return LanguageLocation; } public void setLanguageLocation(String languageLocation) { LanguageLocation = languageLocation; } } @Override public int compare(Person o1, Person o2) { // TODO Auto-generated method stub return 0; } }
Biont.java:
package com.tuxianchao; /** * 生物类 * * @author tuxianchao * */ public class Biont<T> { private double weight; public Biont() { } public Biont(double weight) { super(); this.weight = weight; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public void breath() { System.out.println("呼吸.."); } }
获取构造器信息
package com.tuxianchao; import java.lang.reflect.Constructor; import org.junit.Test; public class TestConstructor { @Test public void test4() throws Exception { // 调用指定的构造函数来创建运行时类的对象 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Constructor constructor = clazz.getConstructor(String.class); constructor.setAccessible(true); Person p1 = (Person) constructor.newInstance("Zhang"); System.out.println(p1); Constructor constructor2 = clazz.getConstructor(String.class, int.class); constructor2.setAccessible(true); Person p2 = (Person) constructor2.newInstance("Li", 20); System.out.println(p2); // 控制台打印 /** * Person [name=Zhang, age=0] * Person [name=Li, age=20] */ } @Test public void test3() throws Exception { // 创建运行时类的对象 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); // 调用的是空参构造函数来构造对象 // 就要求:运行时类需要有空参构造器,且权限足够 // 创建类的时候尽量保留一个空参的构造器:1.便于反射的时候使用(newInstance),2.被继承时子类默认调用父类的空参构造器 Person p = (Person) clazz.newInstance(); System.out.println(p); // 控制台打印 /* * 空参构造器... * Person [name=null, age=0] */ } @Test public void test1() throws Exception { // 获取运行时类的构造器 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Constructor[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); Class[] classes = constructor.getParameterTypes(); System.out.println("形参列表:"); for (Class class1 : classes) { System.out.println(class1.getName()); } System.out.println("----"); } // 控制台打印 /** * * * com.tuxianchao.Person * 形参列表: java.lang.String int * ---- * com.tuxianchao.Person * 形参列表: java.lang.String * ---- * com.tuxianchao.Person * 形参列表: * ---- * */ } }
获取属性信息
package com.tuxianchao; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import org.junit.Test; public class TestField { @Test public void test3() { Class clazz = Person.class; // 获取属性的权限修饰符,变量类型和变量名 Field field2[] = clazz.getDeclaredFields(); for (int i = 0; i < field2.length; i++) { // 1.获取属性的权限修饰符 int mod = field2[i].getModifiers(); System.out.println(Modifier.toString(mod)); // 2.获取属性的变量类型 System.out.println(field2[i].getType()); // 3.获取属性的变量名 System.out.println(field2[i].getName()); System.out.println("--------"); } // 控制台打印 /** * * * int id * -------- * private * class java.lang.String * name * -------- * public * int * age * -------- * */ } @Test public void test2() { // 获取运行时类的属性 Class clazz = Person.class; // 1.getFields()方法只能获取到运行时类极其父类中声明为public的属性 Field field[] = clazz.getFields(); for (int i = 0; i < field.length; i++) { System.out.println(field[i]); } System.out.println("--------------"); // 2.getDeclaredFields()获取运行时类本身声明的属性(不包括父类中的) Field field2[] = clazz.getDeclaredFields(); for (int i = 0; i < field2.length; i++) { System.out.println(field2[i]); } } // 控制台打印 /** * * public int com.tuxianchao.Person.age * -------------- * int com.tuxianchao.Person.id * private java.lang.String com.tuxianchao.Person.name * public int com.tuxianchao.Person.age * */ }
获取方法信息
package com.tuxianchao; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.junit.Test; public class TestMetod { @Test public void test3() { } @Test public void test2() throws Exception { // 获取方法的注解,权限修饰符,返回值类型,方法名,形参列表,异常 String className = "com.tuxianchao.Person"; Class<?> clazz = Class.forName(className); Method method1[] = clazz.getMethods(); for (int i = 0; i < method1.length; i++) { // 获取注解 Annotation[] annotation = method1[i].getAnnotations(); System.out.println("注解:"); for (Annotation annotation2 : annotation) { System.out.println(annotation2); } // 获取权限修饰符 int mod = method1[i].getModifiers(); System.out.println("权限修饰符:" + Modifier.toString(mod)); // 获取返回值类型 System.out.println("返回值类型:" + method1[i].getReturnType()); // 获取方法名 System.out.println("方法名:" + method1[i].getName()); // 获取形参列表 Class[] parameters = method1[i].getParameterTypes(); System.out.println("形参列表:"); for (Class class1 : parameters) { System.out.println(class1.getName()); } // 获取抛出的异常 Class[] exceptiopns = method1[i].getExceptionTypes(); System.out.println("异常:"); for (Class class1 : exceptiopns) { System.out.println(class1.getName()); } System.out.println("------------------"); } // 控制台打印 /* 注解: 权限修饰符:public 返回值类型:class java.lang.String 方法名:toString 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:class java.lang.String 方法名:getName 形参列表: 异常: java.lang.Exception ------------------ 注解: 权限修饰符:public 返回值类型:int 方法名:compare 形参列表: com.tuxianchao.Person com.tuxianchao.Person 异常: ------------------ 注解: 权限修饰符:public volatile 返回值类型:int 方法名:compare 形参列表: java.lang.Object java.lang.Object 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:setName 形参列表: java.lang.String 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:method 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:method 形参列表: java.lang.String 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:setAge 形参列表: int 异常: ------------------ 注解: 权限修饰符:public 返回值类型:int 方法名:getAge 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:setWeight 形参列表: double 异常: ------------------ 注解: 权限修饰符:public 返回值类型:double 方法名:getWeight 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:void 方法名:breath 形参列表: 异常: ------------------ 注解: 权限修饰符:public final 返回值类型:void 方法名:wait 形参列表: 异常: java.lang.InterruptedException ------------------ 注解: 权限修饰符:public final 返回值类型:void 方法名:wait 形参列表: long int 异常: java.lang.InterruptedException ------------------ 注解: 权限修饰符:public final native 返回值类型:void 方法名:wait 形参列表: long 异常: java.lang.InterruptedException ------------------ 注解: 权限修饰符:public 返回值类型:boolean 方法名:equals 形参列表: java.lang.Object 异常: ------------------ 注解: 权限修饰符:public native 返回值类型:int 方法名:hashCode 形参列表: 异常: ------------------ 注解: 权限修饰符:public final native 返回值类型:class java.lang.Class 方法名:getClass 形参列表: 异常: ------------------ 注解: 权限修饰符:public final native 返回值类型:void 方法名:notify 形参列表: 异常: ------------------ 注解: 权限修饰符:public final native 返回值类型:void 方法名:notifyAll 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:reversed 形参列表: 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparing 形参列表: java.util.function.Function 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparing 形参列表: java.util.Comparator 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparing 形参列表: java.util.function.Function java.util.Comparator 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparingDouble 形参列表: java.util.function.ToDoubleFunction 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparingInt 形参列表: java.util.function.ToIntFunction 异常: ------------------ 注解: 权限修饰符:public 返回值类型:interface java.util.Comparator 方法名:thenComparingLong 形参列表: java.util.function.ToLongFunction 异常: ------------------ */ } @Test public void test1() throws Exception { // 获取运行时类的方法 String className = "com.tuxianchao.Person"; Class<?> clazz = Class.forName(className); // 1.获取所有方法 // getMethods()方法获取运行时类和其父类声明为public的方法 Method method1[] = clazz.getMethods(); for (int i = 0; i < method1.length; i++) { System.out.println(method1[i]); } System.out.println("-------------------------"); // getDeclaredMethods()方法获取运行时类本身声明的所有方法 Method method2[] = clazz.getDeclaredMethods(); for (int i = 0; i < method2.length; i++) { System.out.println(method2[i]); } System.out.println("-------------------------"); // 2.获取指定方法 Method method3 = clazz.getMethod("setAge", int.class); System.out.println(method3); } // 控制台打印 /* * public java.lang.String com.tuxianchao.Person.toString() public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person) public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object) public void com.tuxianchao.Person.setName(java.lang.String) public void com.tuxianchao.Person.method() public void com.tuxianchao.Person.method(java.lang.String) public void com.tuxianchao.Person.setAge(int) public int com.tuxianchao.Person.getAge() public void com.tuxianchao.Biont.setWeight(double) public double com.tuxianchao.Biont.getWeight() public void com.tuxianchao.Biont.breath() 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 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() public default java.util.Comparator java.util.Comparator.reversed() public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function) public default java.util.Comparator java.util.Comparator.thenComparing(java.util.Comparator) public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function,java.util.Comparator) public default java.util.Comparator java.util.Comparator.thenComparingDouble(java.util.function.ToDoubleFunction) public default java.util.Comparator java.util.Comparator.thenComparingInt(java.util.function.ToIntFunction) public default java.util.Comparator java.util.Comparator.thenComparingLong(java.util.function.ToLongFunction) ------------------------- public java.lang.String com.tuxianchao.Person.toString() public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person) public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object) public void com.tuxianchao.Person.setName(java.lang.String) public void com.tuxianchao.Person.method() public void com.tuxianchao.Person.method(java.lang.String) public void com.tuxianchao.Person.setAge(int) public int com.tuxianchao.Person.getAge() ------------------------- public void com.tuxianchao.Person.setAge(int) */ }
获取类的其他相关信息
package com.tuxianchao; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.junit.Test; public class TestOthers { @Test public void test4() throws Exception { // 获取所在的包 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Package package1 = clazz.getPackage(); System.out.println(package1.getName()); // 控制台打印 /* com.tuxianchao */ } @Test public void test3() throws Exception { // 获取实现的接口 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Class[] classes = clazz.getInterfaces();// 只能获取到本身实现的接口,获取不到接口的父接口 for (Class class1 : classes) { System.out.println(class1.getName()); } // 控制台打印 /* java.util.Comparator */ } @Test public void test2() throws Exception { // 获取父类的泛型 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Type type = clazz.getGenericSuperclass(); ParameterizedType param = (ParameterizedType) type; Type[] types = param.getActualTypeArguments(); for (Type type2 : types) { System.out.println(((Class) type2).getName()); } // 控制台打印 /* * java.lang.String */ } @Test public void test1() throws Exception { // 获取运行时类的父类 String className = "com.tuxianchao.Person"; Class clazz = Class.forName(className); Class superClazz = clazz.getSuperclass(); System.out.println(superClazz); // 获取带有泛型的父类 Type superClazz1 = clazz.getGenericSuperclass(); System.out.println(superClazz1); } // 控制台打印 /* class com.tuxianchao.Biont com.tuxianchao.Biont<java.lang.String> */ }
相关文章推荐
- Java反射机制总结(二)成员方法和字段的解析
- Java反射机制总结(实例分析)(一)
- Java反射机制的学习总结
- Java反射机制总结之二
- Java知识总结:Java反射机制(用实例理解)
- Java反射机制总结之二
- java反射机制总结
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
- Java反射机制总结之一
- Java反射机制总结(实例分析)(二)
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
- java反射机制学习总结
- Java反射机制详解-总结(1)
- java反射机制总结(一)
- java反射机制学习总结
- 通过java反射机制动态调用某方法的总结
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
- java反射机制学习总结
- Java反射机制总结(实例分析)
- Java反射机制剖析(四)-深度剖析动态代理原理及总结