class Temp{ static{ System.out.println("执行Temp初始化代码块"); } } public class TextDemo_02 { public static void main(String[] args){ System.out.println("执行ClassLoader的loadClass方法"); ClassLoader classLoader=ClassLoader.getSystemClassLoader(); try { classLoader.loadClass("Temp"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("结束执行ClassLoader的loadClass方法"); System.out.println("------------分割线--------------"); System.out.println("开始执行Class的forName方法"); try { Class.forName("Temp"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("结束执行Class的forName方法"); } }
使用ClassLoader类的loadClass()方法来加载某个类时,该方法只加载该类,不会执行该类的初始化代码块,但是使用Class的forName()时会强制初始化该类
2创建对象
方法一:通过Class的newInstance方法创建对象
/** * 存放类名对应的对象 */ private static Map<String, Object> mapStrObj = new HashMap<String, Object>(); private static String a; private static String b; // 初始化类名 static { // 加载配置文件 Properties pp = new Properties(); InputStream inputStrea = Object.class .getResourceAsStream("/object.properties"); try { pp.load(inputStrea); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 读取配置文件中的信息 a = pp.getProperty("a"); b = pp.getProperty("b"); } public TextDemo_02() { // TODO Auto-generated constructor stub System.out.println("正在执行TextDemo_02的构造方法,正在创建TextDemo_02对象"); } /** * 生成对象 * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ public static void createObject() throws InstantiationException, IllegalAccessException, ClassNotFoundException { // 创建对象并添加到map中 Class<?> classA = Class.forName(a); mapStrObj.put(a, classA.newInstance()); Class<?> classB = Class.forName(b); mapStrObj.put(b, classB.newInstance()); } public static void main(String[] args) { try { TextDemo_02.createObject(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } mapStrObj.get("TextDemo_02"); }object.properties文件中的信息:
a=TextDemo_01
b=TextDemo_02
执行结果:
方法二 :通过Constructor对象的newInstance方法来创建对象
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * 创建对象的第二种方法:调用Constructor的newInstance方法 * * @author Shipp * */ public class TextDemo_03 { /** * 定义一个构造方法 * * @param str */ public TextDemo_03(String str) { System.out.println("TextDemo_03有参构造方法传的参数:" + str); System.out.println("正在执行TextDemo_03构造函数,正在创建TextDemo_03对象"); } /** * 创建对象 * * @throws ClassNotFoundException * @throws NoSuchMethodException * @throws RuntimeException * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException */ public static void createObject() throws ClassNotFoundException, NoSuchMethodException, RuntimeException, InstantiationException, IllegalAccessException, InvocationTargetException { Class<?> class1 = Class.forName("TextDemo_03");// 根据类名获取对象 Constructor constructor = class1.getConstructor(String.class);// 获取类中一个带字符串的构造方法 Object obj = constructor.newInstance("创建对象");// 创建对象 } public static void main(String[] args) { try { TextDemo_03.createObject(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException 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(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RuntimeException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }执行结果:
3 调用方法
/** * 被调用的方法 * @param str */ public static void runMethod(String str){ System.out.println("正在执行TextDemo_02的runMethod方法,参数值为"+str); } /** * 执行调用参数 * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public static void invokingMethod() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ //获取对象 Object object=mapStrObj.get("TextDemo_02"); //获取实现类所对应的Class对象 Class<?> tarClass=object.getClass(); //获取希望调用的方法,第一个参数是方法名,从第二个参数开始是对应的形参类型 Method method=tarClass.getMethod("runMethod",String.class); //执行调用,第一个参数是对象,第二个参数是要传的实参 method.invoke(object, "传递进去的参数"); }
4 访问成员变量值
/** * 被访问的值 */ private String strField="初始化"; /** * 访问成员变量值 */ public static void getObjectField() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ //获取对象 Object object=mapStrObj.get("TextDemo_02"); //获取实现类所对应的Class对象 Class<?> tarObject=object.getClass(); //设置成员变量名,参数为变量名 Field field=tarObject.getDeclaredField("strField"); //设置通过反射访问该成员变量时取消权限检查,true取消, field.setAccessible(true); //修改变量的值,第一个参数为要修改的对象,第二个为修改的值 field.set(object, "修改后"); //获取object对象的strField的值,参数为要修改的对象 System.out.println(field.get(object)); }执行结果:
5操作数组
//创建元素类型为String类型 长10的数组 Object object=Array.newInstance(String.class,10); //为数组中赋值,第一个参数为操作的对象,第二个参数为设置值的索引,第三个参数为值 Array.set(object, 0, "0"); Array.set(object, 1, "1"); //从数组中取数据,第一个参数为操作的对象,第二个为索引 Object object0=Array.get(object, 0); Object object1=Array.get(object, 1); System.out.println(object0); System.out.println(object1);执行结果: