想要了解反射,最基本的类就是Class类,因为Class能够保存类的信息。在类中含有构造方法、函数、属性。这些都能够通过某种手段得到。
1.获得字节码的方法:
(1)Class.forName(String)
(2)p.getClass();
(3)P.class;
Class c1 =...;
c1.getDeclaredConstructors();返回一个Constructor数组。 包含一个类中的构造函数。
2.通过构造方法进行反射:newInstance
getConstructor(Class)进行对某个类的构造函数进行声明。
newInstance(Object);能够创建一个实例。
以下为实例:
- Constructor c = String.class.getConstructor(StringBuffer.class);
- String str = (String) c.newInstance(new StringBuffer("123"));
- System.out.println(str);
3.对于域的反射:get
能够反映出当前对象的域的值是多少.
私有变量的反射需要f.setAccessible(true);
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- public class ReflectField {
- public static void main(String[] args) {
- ReflectPoint o = new ReflectPoint(1, 2);
- Field fy = null;
- try {
- fy = o.getClass().getDeclaredField("y");
- fy.setAccessible(true);
- Integer x = (Integer) fy.get(o);
- System.out.println(x);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class ReflectPoint {
- private int x;
- private int y;
- public ReflectPoint(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
- }
示例:有一个类,其中包含很多字符串的属性,想要把每个字符串属性中的‘b’变成‘a’,并显示结果
- import java.lang.reflect.AccessibleObject;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- public class ReflectField {
- public static void main(String[] args) {
- ReflectPoint o = new ReflectPoint(1, 2);
- Field[] fs ;
- try {
- fs = o.getClass().getDeclaredFields();
- AccessibleObject.setAccessible(fs, true);
- for(Field f:fs)
- {
- if(f.getType() ==String.class)
- {
- String str = (String)f.get(o);
- String result = str.replace("b", "a");
- f.set(o, result);
- System.out.println(result);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class ReflectPoint {
- private int x;
- private int y;
- private String str1 = "basketball";
- private String str2 = "ball";
- private String str3 = "it";
- public ReflectPoint(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
- }
(1)getMethod()声明
(2)invoke()方法调用
- import java.lang.reflect.AccessibleObject;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- public class ReflectField {
- public static void main(String[] args) {
- ReflectPoint o = new ReflectPoint();
- try {
- Method m = o.getClass().getDeclaredMethod("getStr1", null);
- String name = (String) m.invoke(o, null);
- System.out.println(name);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class ReflectPoint {
- private String str1 = "busketBall";
- public ReflectPoint() {
- super();
- }
- public String getStr1()
- {
- return str1;
- }
- }
Constructor:
(1)getModifiers();返回访问权限。能够由Modifier.toString(i)转换成字符串。
(2)getName();返回构造函数的函数名。
(3)getParameterTypes()返回参数的Class,需要对每个参数Class调用getName()获得参数类型。
c1.getDeclaredFields();返回一个Field数组。 包含一个类中的属性。
Field:
(1)getType()返回属性类型
(2)f.get(Object obj);Obj是一个类,包含f属性,返回当前f属性的当前值。
(3)int i=getModifiers()返回访问权限。能够由Modifier.toString(i)转换成字符串。
(4)getName()返回属性名称。
(5)f.set(Object obj,Object val);把Object类中的f属性设置为val值。
c1.getDeclaredMethods()返回一个Method数组。 包含一个类中的一般方法。
Method:
(1)getModifiers()返回访问权限。能够由Modifier.toString(i)转换成字符串。
(2)getName();返回函数的函数名。
(3)getParameterTypes()返回参数的Class,需要对每个参数Class调用getName()获得参数类型。
(4)getReturnType()返回值的类型
下面是一个示例代码,输入一个类,然后把输入类的构造方法,域,函数都打印出来:
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.Scanner;
- public class ReflectTest {
- public static void main(String args[])
- {
- Scanner in = new Scanner(System.in);
- String str = in.nextLine();
- Class c = null;
- try {
- c = Class.forName(str);
- } catch (ClassNotFoundException e) {
- System.out.println("********出错!********");
- e.printStackTrace();
- }
- String tmp = Modifier.toString(c.getModifiers());
- System.out.println(tmp+" class "+c.getName()+"{");
- printField(c);
- printConstructor(c);
- printMethod(c);
- System.out.println("}");
- }
- public static void printField(Class c)
- {
- Field[] f = c.getDeclaredFields();
- for(int i=0;i<f.length;i++)
- {
- int p = f[i].getModifiers();
- String tmp = Modifier.toString(p);
- String type = f[i].getType().getName();
- String name = f[i].getName();
- System.out.println(" "+tmp+" "+type+" "+name+";");
- }
- }
- public static void printConstructor(Class c)
- {
- Constructor[] con = c.getDeclaredConstructors();
- for(int i=0;i<con.length;i++)
- {
- int p = con[i].getModifiers();
- String tmp = Modifier.toString(p);
- String name = con[i].getName();
- Class[] param = con[i].getParameterTypes();
- System.out.print(" "+tmp+" "+name+"(");
- for(int j=0;j<param.length;j++)
- {
- System.out.print(param[j].getName());
- }
- System.out.println(");");
- }
- }
- public static void printMethod(Class c)
- {
- Method[] m = c.getDeclaredMethods();
- for(int i=0;i<m.length;i++)
- {
- int p = m[i].getModifiers();
- String tmp = Modifier.toString(p);
- String type = m[i].getReturnType().getName();
- String name = m[i].getName();
- Class[] param = m[i].getParameterTypes();
- System.out.print(" "+tmp+" "+type+" "+name+"(");
- for(int j=0;j<param.length;j++)
- {
- System.out.print(param[j].getName());
- }
- System.out.println(");");
- }
- }
- }