反射是jdk1.2就有的特性,在将来的框架中都要用到反射技术,所谓的反射:就是吧java类中的各种成分映射成相应的java类,因此我们首先要明白什么事java类。在java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class,因此Class类是反射的基石。在这里的Class第一个C是大写的,它不同于我们在编写程序时写的class那个class是小写的,Class类是java类名的名称,Class类的实例对象是代表着一个字节码。所谓字节码就是把一个类的二进制代码加载在内存中即为字节码。用到一种类都会有一份字节码,每一份字节码都是一个Class的实例对象。获取字节码的方法有三种:
1.类名.class 例如: System.class
2.对象.getClass() 例如: new DaTe().getClass
3.Class.forName("类名") 例如: Class.forName("java.util.Date"); // 实际开发中用的最多的一种方法
1.类名.class 例如: System.class
2.对象.getClass() 例如: new DaTe().getClass
3.Class.forName("类名") 例如: Class.forName("java.util.Date"); // 实际开发中用的最多的一种方法
在java中存在着9个预定义的Class实例对象分别为:boolean,byte,char,short,int,long,float,double和viod这九种预定义实例对象,他们可以使用上述的第三种方法获取字节码。
Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法;
4.在运行时调用任意一个对象的方法。
Java Reflection APIs 简介:
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
–Class类:代表一个类
–Field类:代表类的成员变量(成员变量也成为类属性)
–Method类:代表类的方法
–Constructor类:代表类的构造方法
–Array类:提供动态创建数组,以及访问数组的元素的静态方法
Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
两个例子程序:
Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法;
4.在运行时调用任意一个对象的方法。
Java Reflection APIs 简介:
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
–Class类:代表一个类
–Field类:代表类的成员变量(成员变量也成为类属性)
–Method类:代表类的方法
–Constructor类:代表类的构造方法
–Array类:提供动态创建数组,以及访问数组的元素的静态方法
Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
两个例子程序:
示例一:
import java.lang.reflect.*;
public class DumpMethods
{
public static void main(String[] args) throws Exception
{
Class<?> classType = Class.forName("java.lang.String"); //Class对象描述了某个特定的类对象
Method[] methods = classType.getDeclaredMethods(); //通过反射获取到所有的方法
for(Method m : methods) //打印所有的方法
{
System.out.println(m);
}
}
}
示例二:
import java.lang.reflect.*;
public class InvokeTester
{
public int add(int parm1, int parm2)
{
return parm1 + parm2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args) throws Exception
{
InvokeTester test = new InvokeTester();
System.out.println(test.add(1, 2));
System.out.println(test.echo("Java"));
Class<?> classType = InvokeTester.class;
Object o = classType.newInstance(); //通过反射生成一个InvokeTester类型的对象
Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); //通过反射获取到add方法
System.out.println(addMethod.invoke(o,new Object[]{1,2})); //调用对象的add方法并把参数传进去
Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); //通过反射获取到echo方法
System.out.println(echoMethod.invoke(o, new Object[]{"Java"})); //调用对象的echo方法并把参数传进去
}
}
若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1)先获得Class对象,然后通过该Class对象的newInstance方法直接获得即可。如
Class<?> classType = String.class;
Object o = classType.newInstance();
2)先获得Class对象,然后通过该Class对象获得所对应的Constructor对象,再通过该Constructor对象的newInstance方法生成。如
Class<?> classType = Customer.class;
Constructor constructor =classType.getConstructor(new Class[]{});
Object o1 = constructor.newInstance(new Object[]{});
{
Class<?> classType = Class.forName("java.lang.String"); //Class对象描述了某个特定的类对象
Method[] methods = classType.getDeclaredMethods(); //通过反射获取到所有的方法
for(Method m : methods) //打印所有的方法
{
System.out.println(m);
}
}
}
示例二:
import java.lang.reflect.*;
public class InvokeTester
{
public int add(int parm1, int parm2)
{
return parm1 + parm2;
}
public String echo(String message)
{
return "hello:" + message;
}
public static void main(String[] args) throws Exception
{
InvokeTester test = new InvokeTester();
System.out.println(test.add(1, 2));
System.out.println(test.echo("Java"));
Class<?> classType = InvokeTester.class;
Object o = classType.newInstance(); //通过反射生成一个InvokeTester类型的对象
Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); //通过反射获取到add方法
System.out.println(addMethod.invoke(o,new Object[]{1,2})); //调用对象的add方法并把参数传进去
Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); //通过反射获取到echo方法
System.out.println(echoMethod.invoke(o, new Object[]{"Java"})); //调用对象的echo方法并把参数传进去
}
}
若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1)先获得Class对象,然后通过该Class对象的newInstance方法直接获得即可。如
Class<?> classType = String.class;
Object o = classType.newInstance();
2)先获得Class对象,然后通过该Class对象获得所对应的Constructor对象,再通过该Constructor对象的newInstance方法生成。如
Class<?> classType = Customer.class;
Constructor constructor =classType.getConstructor(new Class[]{});
Object o1 = constructor.newInstance(new Object[]{});
若想通过类的带参数的构造方法来生成对象,只能使用下面这种方式:
Class<?> classType = Customer.class;
Constructor constructor2 = classType.getConstructor(new Class[]{String.class,int.class});
Object o2 = constructor.newInstance(new Object[]{"张三",20});
Class<?> classType = Customer.class;
Constructor constructor2 = classType.getConstructor(new Class[]{String.class,int.class});
Object o2 = constructor.newInstance(new Object[]{"张三",20});