黑马程序员_JAVA学习笔记6

来源:互联网 发布:极光数据恢复软件官网 编辑:程序博客网 时间:2024/06/05 14:59

---------------------- 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。

0 0