反射机制

69 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 区别类对象 类对象的区别就是他们有不同的方法,属性。 2. 获取对象的三种方式

  1. Class.forName
  2. Hero.class
  3. new Hero().getClass()
public class TestReflection {

	public static void main(String[] args) {
			String className = "charactor.Hero";
			try {
				Class pClass1=Class.forName(className);
				Class pClass2=Hero.class;
				Class pClass3=new Hero().getClass();
				System.out.println(pClass1==pClass2);
				System.out.println(pClass1==pClass3);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
	}
}

3.通过反射机制获取一个对象

public class TestReflection {
    public static void main(String[] args) {
        //传统的使用new的方式创建对象
        Hero h1 =new Hero();
        h1.name = "teemo";
        System.out.println(h1);
        try {
            //使用反射的方式创建对象
            String className = "charactor.Hero";
            //类对象
            Class pClass=Class.forName(className);
            //构造器
            Constructor c= pClass.getConstructor();
            //通过构造器实例化
            Hero h2= (Hero) c.newInstance();
            h2.name="gareen";
            System.out.println(h2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.访问属性 为了访问属性,把name修改为public。 对于private修饰的成员,需要使用setAccessible(true)才能访问和修改。

public class TestReflection {
    public static void main(String[] args) {
            Hero h =new Hero();
            //使用传统方式修改name的值为garen
            h.name = "garen";
            try {
            	//获取类Hero的名字叫做name的字段
                Field f1= h.getClass().getDeclaredField("name");
                //修改这个字段的值
                f1.set(h, "teemo");
                //打印被修改后的值
                System.out.println(h.name);      
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
}

5.调用方法 public class TestReflection {

public static void main(String[] args) {
	Hero h = new Hero();

	try {
		// 获取这个名字叫做setName,参数类型是String的方法
		Method m = h.getClass().getMethod("setName", String.class);
		// 对h对象,调用这个方法
		m.invoke(h, "盖伦");
		// 使用传统的方式,调用getName方法
		System.out.println(h.getName());

	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

}

} 反射的作用:

public class Test {
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) throws Exception {
		//从spring.txt中获取类名称和方法名称
		File springConfigFile = new File("e:\\project\\j2se\\src\\spring.txt");
		Properties springConfig= new Properties();
		springConfig.load(new FileInputStream(springConfigFile));
		String className = (String) springConfig.get("class");
		String methodName = (String) springConfig.get("method");

		//根据类名称获取类对象
		Class clazz = Class.forName(className);
		//根据方法名称,获取方法对象
		Method m = clazz.getMethod(methodName);
		//获取构造器
		Constructor c = clazz.getConstructor();
		//根据构造器,实例化出对象
		Object service = c.newInstance();
		//调用对象的指定方法
		m.invoke(service);
	}
}