Java反射API提供了动态执行能力 Class API:java.lang.Class,用于加载类和获取类的相关信息 Java反射API位于java.lang.reflect包中。主要包含以下几类:
Constructor类:用来描述一个类的构造方法Field类:用来描述一个类的成员变量Method类:用来描述一个类的方法Modifier类:用来描述类内各元素的修饰符Array:用来对数组进行操作java反射机制 反射是一种动态机制,允许我们实例化对象,调用方法,操作属性从编码期间确定转移到程序运行期确定。 因此反射提高了程序的灵活度,但是随之带来的是更多的系统开销和较慢的运行效率,因此反射机制不能过度的使用 。
(1)加载类的类对象
Class cls = Class.forName("reflect.Person"); Object o = cls.newInstance();//必须有无参构造器 System.out.println(o);(2)利用反射调用私有成员
Person p = new Person(); // p.dosome();编译不通过 Class<?> cls = Class.forName("reflect.Person"); Object o = cls.newInstance(); //获取Person中的私有方法dosome Method m = cls.getDeclaredMethod("dosome"); m.setAccessible(true); m.invoke(o);(3)通过指定的构造器实例化对象
Person p = new Person(); System.out.println(p); Person p1 = new Person("李四",55); System.out.println(p1); Class<?> cls = Class.forName("reflect.Person"); //获取构造器(无参构造器) Constructor<?> c = cls.getConstructor(); //利用该构造器实例化对象 Object o = c.newInstance(); System.out.println(o); //利用Person(String,int) Constructor<?> c2 = cls.getConstructor(String.class,int.class); //实例化 Object o2 = c2.newInstance("西瓜",18); System.out.println(o2);(4)使用反射机制调用方法
Person p = new Person(); p.sayHello(); Scanner scanner = new Scanner(System.in); System.out.println("请输入类名:"); String className = scanner.nextLine(); System.out.println("请输入方法名:"); String methodName = scanner.nextLine(); //实例化 Class<?> c = Class.forName(className); Object o = c.newInstance();//Person o = new Person(); //获取sayHello方法并调用 Method m = c.getMethod(methodName); //Method提供了一个动态执行一个方法的方法:Object invoke(Object obj,Object..args) m.invoke(o);//o.sayHello(); System.out.println("aaaaaaaaaaaaaaaaaaaaaaaa");(5)调用有参方法
Person p = new Person(); p.sayHello("大家好!"); p.say("Carry", 18); Class cls = Class.forName("reflect.Person"); Object o = cls.newInstance(); //sayHello(String) Method m = cls.getMethod("sayHello", String.class); m.invoke(o, "哈喽~"); Method m1 = cls.getMethod("say", String.class,int.class); m1.invoke(o, "兔子",22);