---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
反射:JAVA 中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
例子:
public class InvokeTest
{
public int add(int param1,int param2)
{
return param1 + param2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args)
{
Class<?> classType = Class.forName(args[0]);
Class<?> classType2 = InvokeTest.class;
上面 为两种 得到 Class对象的方式。
获取某个类或某个对象所对应的Class对象的常用3种方式:
1) 使用Class类的静态方法 forName:Class.forName(“java.lang.String”);
2) 使用.class语法:String.class
3) 使用对象的getClass()方法:String s = “aa”; CClass<?> cla = s.getClass();
public class InvokeTest{
public int add(int param1,int param2)
{
return param1 + param2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args)
{
Class<?> classType2 = Class.forName(args[0]);
Class<?> classType = InvokeTest.class;
Object invokeTest = classType.newInstance();
Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});
Object result = addMethod.invoke(invokeTest, new Object[]{1,2});
System.out.println((Integer)result);
System.out.println("------------");
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
Object result2 = echoMethod.invoke(invokeTest, new Object[]{"tom"});
System.out.println((String)result2);
若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1.先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
2.先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class,int.class});
Object obj = obj = cons.newInstance(new Object[] {"hello",3});
通过反射访问私有方法:
public static void main(String[] args) throws Exception
{
Private p = new Private();
Class<?> classType = p.getClass();
Method method = classType.getDeclaredMethod("sayHello",new Class[] {String.class});
//压制java的访问控制检查
method.setAccessible(true);
String str = (String)method.invoke(p,new Object[]{"zhangsan"});
System.out.println(str);
}
Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达java程序运行时的class和interfaces,也用来表达enum、array、primitive java types 能及关键词void.当一个class被加载,或当加载器的defineClass()被JVM调用,JVM便自动产生一个Class object。如果您想借由修改JAVA标准库源码来观察Class object 的实际生成时机,不能够!因为class并没有public constructor。