1. 类的加载、连接和初始化:
1.1 类的加载:
双亲委派机制:
类加载器:
1.2 类的链接:
1.3 类的初始化:
2 反射:
2.1 反射的基本信息:
2.1.1class对象:
2.2 Java反射机制的类库支持:
2.2.1 获取class对象:
2.2.2 获取构造器:
3. 反射相关类和方法:
3.1 class类:
3.2 Filed类:
3.3 Method类:
3.4 Construction类:
4. 反射的实现:
反射应用步骤:
反射实例:
// 获取class对象
Class cls = Class.forName("com.ConstructorDemo");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
// cls是一个class的对象,使用getConstructor方法获取构造器
Constructor ct= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
// 得到一个ConstructorDemo类的对象
Object retobj = ct.newInstance(arglist);
// 获得Field对象
Field cd = cls.getDeclaredField("d");
ConstructorDemo c = new ConstructorDemo();
// 无视访问权限
cd.setAccessible(true);
System.out.println(c.getD());
// 设置对象c的d属性
cd.setDouble(c,1.23);
System.out.println(c.getD());
// 获取class对象
Class cls1 = Class.forName("com.MethodDemo");
Class partypes1[] = new Class[2];
partypes1[0] = Integer.TYPE;
partypes1[1] = Integer.TYPE;
// 获取Method对象
Method meth = cls1.getMethod("add", partypes1);
MethodDemo methobj = new MethodDemo();
Object arglist1[] = new Object[2];
arglist1[0] = new Integer(37);
arglist1[1] = new Integer(47);
// 引用methobj对象的add方法
Object retobj1= meth.invoke(methobj, arglist1);
Integer retval = (Integer)retobj1;
System.out.println(retval.intValue());
5. 反射的作用:
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class reflectTest {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
ClassLoader classLoader = reflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("Ajava/interview/reflect/pro.properties");
pro.load(is);
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
// 以上都是加载配置文件部分
// 以下都是不用 new 类名()的方法的代码
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(obj);
}
}
反射最大的作用就是,如果类相关的代码修改了,不用去代码里每一出new 的后面修改类的名字,只需要修改配置文件就可以了。这也是框架的基础。