关于反射机制(reflect)
一.Java中,无论生成某个类的多少对象,这些对象都会对应于同一个Class对象。(一个类有且只有一个Class对象)。
二.要想使用反射,首先需要获得待处理类或对象的对应的Class对象。
三.获取某个类或对象所对应的Class对象的常用的3中方式:
1. 类名.class 类的一个语法(返回其Class对象)。
2. Class.forName(“类个全名”) 使用Class的静态方法返回Class对象。全名=包名. 类名
3. 对象.getClass() 返回该对象所对应类的Class对象。
四.若想通过类的不带参数的构造器来生成对象,我们有两种方法:
1. 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
2. 先获得Class对象,然后通过该对象获得对应的Construction对象,再通过该Construction对象的newInstance()方法生成的:
Class<?> classType = Customer.class;
Constructor con= classType.getConstructor(new Class[]{});这里注意下new Clas[]{}表示的是构造器参数列表,其原型是Class<?>…parameterTypes。“…”表示可变参数。
3. Object obj =con.newInstance(new Object[]{});
五.若想通过类的带参数的构造器生成对象,只能使用下面的方式:
Class<?> classType = Customer.class;
Constructor con = classType.getConstructor(new Class[]{……});
Object obj = con.newInstance(new Object[]{……});
六.Integer.TYPE返回的是int,而Integer.class返回的是Integer类对应的Class对象。
七.反射的三大步骤:
1. 先创建对象或者类的Class对象。
2. 然后通过Class对象调用相应方法创建Constructor、Field或Method对象。
3. 再通过该对象(Constructor、Field或Method)调用相应的方法实现具体功能。
八.下面就private访问的问题提供一些Code参考。
1. 关于私有属性的访问。
package reflect;
import java.lang.reflect.Field;
public classPrivateField
{
private String name;
public String getName()
{
return name;
}
public static void main(String[] args) throws Exception
{
PrivateFieldstr = newPrivateField();
Class<?>classType = str.getClass();
Fieldfield = classType.getDeclaredField("name");
field.setAccessible(true);
field.set(str,"FuckYou!`");//压制Java访问控制检查
System.out.println(str.getName());
}
}
2. 有关私有方法的访问。
package reflect;
import java.lang.reflect.Method;
public classPrivateMethod
{
private String show(Stringstr)
{
return "Hello`"+ str;
}
public static void main(String[] args) throws Exception
{
PrivateMethodp = newPrivateMethod();
Class<?>classType = p.getClass();
Methodmethod = classType.getDeclaredMethod("show", newClass[]{String.class});
method.setAccessible(true);
Strings = (String)method.invoke(p, new Object[]{"Fuckyou"});
System.out.println(s);
}
}
3. 关于构造器的访问。
package reflect;
import java.lang.reflect.Constructor;
public classPrivateConstructor
{
private static String name = "FuckYou`";
public String toString()
{
return name;
}
public static void main(String[] args) throws Exception
{
Class<?>classType = PrivateConstructor.class;
Constructor<?>con = classType.getConstructor(new Class[]{});
Objectobj = con.newInstance(new Object[]{});
System.out.println(obj);
}
}
4. 关于数组的访问。
package reflect;
import java.lang.reflect.Array;
public classArrayTest
{
public static void main(String[] args)
{
int[] dims = new int[] {5, 10, 15};
Objectarray = Array.newInstance(Integer.TYPE, dims);
ObjectarrayObj = Array.get(array, 3);
Class<?>classType = arrayObj.getClass().getComponentType();
arrayObj= Array.get(arrayObj, 5);
Array.setInt(arrayObj,10, 37);
int[][][] arrayCast = (int[][][]) array;
System.out.println(arrayCast[3][5][10]);
}
}