---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、类类型信息
运行时类型信息使得你可以在程序运行时发现和使用类型信息。
二、Class对象
它包含了与类有关的信息。事实上,Class对像就是用来创建类的所有的“常规”对象的。
类是程序的一部分,每个类都有一个class对象。换言之,每当编写并且编译了一个新类,就会产生一个class对象,它是被保存在一个同名的.class文件中。此类由Java虚拟机使用类加载器创建。 所有的类都是在对其第一次使用时,动态加载到JVM中的,就是说需要那个类时才加载。一旦某个类的class对象被载入内存,它就被用来创建这个类的所有对象。
为了使用类而做的准备工作实际包含三个步骤:
1. 加载,这是由类加载器执行的。该步骤将查找字节码(通常在classpath所指定的路径中查找),并从这些字节码中创建一个class对象。
2. 链接,在链接阶段将验证类中的字节码,为静态域分配内存空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。
3. 初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
三、反射:运行时的类信息
可以简单的理解为已知类名,来调用类成员或是对象成员的过程称为反射。他的设计思想是把类中的成员看作一个Java类,比如说成员方法类(Method)、成员变量类(Field)、构造方法类(Contructor)、字节码文件类(Class)
反射类库包:java.lang.reflect
重要的工具类及其常用方法:
Class<T>,描述类相关信息。
getFields(),获取类中所有的成员变量。
getMethods(),获取类中所有的成员方法。
getConstructors(),获取类中所有的构造器方法。
Field,描述类中对象的成员变量的类。
get(),获取类中某一成员变量的值。
set(),设置类中某一成员变量的值。
Method,描述类中对象的成员方法的类。
invoke(),调用类中的方法。
Constructor,描述构造器的类。
newInstance(),创建一个对象。
代码样例:
Base类
package demo.test.reflect;
public class Base {
public Integer id=0;
public String name="base";
public boolean isEmpty=true;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isEmpty() {
return isEmpty;
}
public void setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
}
public Base(String s){
System.out.println(s);
}
public Base(int x,int y){
System.out.println("两个数的结果为:"+(x+y));
}
public Base(){
System.out.println("我是Base类,无参构造器");
}
public void testA(){
System.out.println("我是testA()方法");
}
public void testB(String s){
System.out.println("我是testB()方法");
System.out.println("输入的值为:"+s);
}
}
使用反射技术操作Base类
package demo.test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class DemoMain {
public static void main(String[] args) {
Class clazz=null;
Base base=null;
try {
clazz=Class.forName("demo.test.reflect.Base");//在classpath下获取类信息
base=(Base)clazz.newInstance();//初始化类对象
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//显示类的所有成员变量,成员变量必须是public,否则成员变量获取不到。
System.out.println("Base类的成员变量:");
Field[] fields=clazz.getFields();
for(Field f:fields){
System.out.println(f.getName());
}
System.out.println("设置与获取成员变量的值:");
try {
Field field=clazz.getField("id");
field.set(base, 5);
System.out.println(field.get(base));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("--------------------");
System.out.println("Base类的构造方法:");
Constructor[] constructors=clazz.getConstructors();
for(Constructor c:constructors){
System.out.println(c.getName());
}
System.out.println("--------------------");
System.out.println("Base类的成员方法:");
Method[] methods=clazz.getMethods();
for(Method m:methods){
System.out.println(m.getName());
}
System.out.println("--------------------");
System.out.println("Base类调用成员方法:");
try {
Method method=clazz.getMethod("testB",String.class);
method.invoke(base, "a");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("--------------------");
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>