java反射机制详解
2017-03-02 22:11
288 查看
目录
•1反射机制是什么
•2反射机制能做什么
•3反射机制的相关API
•·通过一个对象获得完整的包名和类名
•·实例化Class类对象
•·获取一个对象的父类与实现的接口
•·获取某个类中的全部构造函数 - 详见下例
•·通过反射机制实例化一个类的对象
•·获取某个类的全部属性
•·获取某个类的全部方法
•·通过反射机制调用某个类的方法
•·通过反射机制操作某个类的属性
•·反射机制的动态代理
•4反射机制的应用实例
•·在泛型为Integer的ArrayList中存放一个String类型的对象。
•·通过反射取得并修改数组的信息
•·通过反射机制修改数组的大小
•·将反射机制应用于工厂模式
•在运行时判断任意一个对象所属的类;
•在运行时构造任意一个类的对象;
•在运行时判断任意一个类所具有的成员变量和方法;
•在运行时调用任意一个对象的方法;
•生成动态代理。
•1反射机制是什么
•2反射机制能做什么
•3反射机制的相关API
•·通过一个对象获得完整的包名和类名
•·实例化Class类对象
•·获取一个对象的父类与实现的接口
•·获取某个类中的全部构造函数 - 详见下例
•·通过反射机制实例化一个类的对象
•·获取某个类的全部属性
•·获取某个类的全部方法
•·通过反射机制调用某个类的方法
•·通过反射机制操作某个类的属性
•·反射机制的动态代理
•4反射机制的应用实例
•·在泛型为Integer的ArrayList中存放一个String类型的对象。
•·通过反射取得并修改数组的信息
•·通过反射机制修改数组的大小
•·将反射机制应用于工厂模式
1反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2反射机制能做什么
反射机制主要提供了以下功能:•在运行时判断任意一个对象所属的类;
•在运行时构造任意一个类的对象;
•在运行时判断任意一个类所具有的成员变量和方法;
•在运行时调用任意一个对象的方法;
•生成动态代理。
3反射机制的相关API
通过一个对象获得完整的包名和类名
package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName()); // 结果 net.xsoftlab.baike.TestReflect } }
实例化Class类对象
package net.xsoftlab.baike; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> class1 = null; Class<?> class2 = null; Class<?> class3 = null; // 一般采用这种形式 class1 = Class.forName("net.xsoftlab.baike.TestReflect"); class2 = new TestReflect().getClass(); class3 = TestReflect.class; System.out.println("类名称 " + class1.getName()); System.out.println("类名称 " + class2.getName()); System.out.println("类名称 " + class3.getName()); } }
获取一个对象的父类与实现的接口
package net.xsoftlab.baike; import java.io.Serializable; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect"); // 取得父类 Class<?> parentClass = clazz.getSuperclass(); System.out.println("clazz的父类为:" + parentClass.getName()); // clazz的父类为: java.lang.Object // 获取所有的接口 Class<?> intes[] = clazz.getInterfaces(); System.out.println("clazz实现的接口有:"); for (int i = 0; i < intes.length; i++) { System.out.println((i + 1) + ":" + intes[i].getName()); } // clazz实现的接口有: // 1:java.io.Serializable } }
获取某个类中的全部构造函数 - 详见下例
通过反射机制实例化一个类的对象
package net.xsoftlab.baike; import java.lang.reflect.Constructor; public class TestReflect { public static void main(String[] args) throws Exception { Class<?> class1 = null; class1 = Class.forName("net.xsoftlab.baike.User"); // 第一种方法,实例化默认构造方法,调用set赋值 User user = (User) class1.newInstance(); user.setAge(20); user.setName("Rollen"); System.out.println(user); // 结果 User [age=20, name=Rollen] // 第二种方法 取得全部的构造函数 使用构造函数赋值 Constructor<?> cons[] = class1.getConstructors(); // 查看每个构造方法需要的参数 for (int i = 0; i < cons.length; i++) { Class<?> clazzs[] = cons[i].getParameterTypes(); System.out.print("cons[" + i + "] ("); for (int j = 0; j < clazzs.length; j++) { if (j == clazzs.length - 1) System.out.print(clazzs[j].getName()); else System.out.print(clazzs[j].getName() + ","); } System.out.println(")"); } // 结果 // cons[0] (java.lang.String) // cons[1] (int,java.lang.String) // cons[2] () user = (User) cons[0].newInstance("Rollen"); System.out.println(user); // 结果 User [age=0, name=Rollen] user = (User) cons[1].newInstance(20, "Rollen"); System.out.println(user); // 结果 User [age=20, name=Rollen] } } class User { private int age; private String name; public User() { super(); } public User(String name) { super(); this.name = name; } public User(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]"; } }
获取某个类的全部属性
package net.xsoftlab.baike; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect"); System.out.println("===============本类属性==============="); // 取得本类的全部属性 Field[] field = clazz.getDeclaredFields(); for (int i = 0; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); } System.out.println("==========实现的接口或者父类的属性=========="); // 取得实现的接口或者父类的属性 Field[] filed1 = clazz.getFields(); for (int j = 0; j < filed1.length; j++) { // 权限修饰符 int mo = filed1[j].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = filed1[j].getType(); System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";"); } } }
获取某个类的全部方法
package net.xsoftlab.baike; import java.io.Serializable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class TestReflect implements Serializable { private static final long serialVersionUID = -2862585049955236662L; public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect"); Method method[] = clazz.getMethods(); for (int i = 0; i < method.length; ++i) { Class<?> returnType = method[i].getReturnType(); Class<?> para[] = method[i].getParameterTypes(); int temp = method[i].getModifiers(); System.out.print(Modifier.toString(temp) + " "); System.out.print(returnType.getName() + " "); System.out.print(method[i].getName() + " "); System.out.print("("); for (int j = 0; j < para.length; ++j) { System.out.print(para[j].getName() + " " + "arg" + j); if (j < para.length - 1) { System.out.print(","); } } Class<?> exce[] = method[i].getExceptionTypes(); if (exce.length > 0) { System.out.print(") throws "); for (int k = 0; k < exce.length; ++k) { System.out.print(exce[k].getName() + " "); if (k < exce.length - 1) { System.out.print(","); } } } else { System.out.print(")"); } System.out.println(); } } }
通过反射机制调用某个类的方法
相关文章推荐
- 【转】java反射机制详解
- java反射机制详解!
- java反射机制详解
- java反射机制详解 及 Method.invoke解释
- java反射机制详解
- Java反射机制详解
- java反射机制详解 及 Method.invoke解释 getMethod
- Java反射机制深入详解
- Java反射机制的实现详解
- JAVA反射机制入门(二)--getMethods()系列方法特例详解
- Java反射机制详解
- Java反射机制详解
- [转载]java反射机制详解 及 Method.invoke解释
- Java反射机制详解
- Java反射机制详解与实例
- JAVA反射机制详解
- java反射机制详解 及 Method.invoke解释
- java反射机制详解 及 Method.invoke解释
- java反射机制基础详解(转)
- JAVA反射机制详解