Java反射机制总结二
来源:互联网 发布:淘宝卖家申诉入口 编辑:程序博客网 时间:2024/06/05 14:44
当我们获取到Class对象的时候,就可以用来获取Class的完整结构,包括构造器,属性,方法和其他的一些信息(父类,包名,接口等信息)。
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> */}
0 0
- Java反射机制总结二
- Java反射机制总结之二
- Java反射机制总结之二
- java反射机制(二)
- Java反射机制二
- 《Java》-----反射机制二
- Java反射机制二
- Java反射机制总结
- java反射机制总结
- Java反射机制总结
- Java 反射机制总结
- Java反射机制总结
- java反射机制总结
- Java反射机制总结
- JAVA反射机制总结
- java反射机制总结
- Java反射机制总结
- Java反射机制总结
- 分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例
- ImageView点击效果(变色)
- RxAndroid之初体验(一)
- 淘宝架构框架
- Spring Boot中使用Redis数据库
- Java反射机制总结二
- provider: Shared Memory Provider, error: 40 - 无法打开到 SQL Server 的连接
- 实习总结2
- 视频云面向海量用户的分布式视频处理技术
- Tensorflow从文件读取数据
- 封装iframe对象为jquery 对象
- lua脚本调用redis生成流水号
- leetcode(27).107. Binary Tree Level Order Traversal II
- IOS 仿微信聊天界面