反射机制可以创建对象,随时的实例化对象。
一、调用类对象的两种方法
// 通过类对象来创建。
Class cls=Class.forName("reflect.ReflectDemo1");
System.out.println(cls.getName());// reflect.ReflectDemo1
System.out.println(ReflectDemo1.class.getName());// reflect.ReflectDemo1
Class cls==类名.class
二、利用类对象来创建实例化对象
package reflect;
public class ReflectDemo2 {
public ReflectDemo2() {
System.out.println("干饭");
System.out.println("干中午饭");
System.out.println("干早饭");
}
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException {
// 通过类对象来创建。
Class cls=Class.forName("reflect.ReflectDemo2");
Object o = cls.newInstance();//等同于
ReflectDemo2 reflectDemo2 = new ReflectDemo2();
System.out.println(reflectDemo2);//干饭干中午饭干早饭
System.out.println(o);//干饭干中午饭干早饭
}
}
三、通过键盘输入来获取类对象
System.out.println("输入类值");
Scanner scanner = new Scanner(System.in);
String classname = scanner.nextLine();
//通过键盘输入来创建类对象
Class cls = Class.forName(classname);
//获取该类下所有方法名
Method[] method1 = cls.getMethods();
System.out.println("method 方法有: ");
for (Method method : method1) {
System.out.print(method.getName()+" 、");
}
System.out.println("输入方法的值");
//只有实例化对象才能调用其方法
Object o = cls.newInstance();
String s = scanner.nextLine();
Method method = cls.getMethod(s);
//用此方法调用对象
method.invoke(o);
Object o = cls.newInstance(); 实例化类,只有实例化才能调用方法
Method method = cls.getMethod("playGame"); 这里放着要调用的方法
method.invoke(o); 调用方法。
四、调用有参方法(需传值)
Object o = cls.newInstance();
Method method0 = cls.getMethod("say");//调用无参方法
Method method = cls.getMethod("say", String.class,int.class);//调用有参方法 method0.invoke(o);
method.invoke(o,"jib",5);
五、获取私有方法,和在外部调用私有方法
Class cls = Class.forName("reflect.Person");
Object o = cls.newInstance();
// 1.正常获取类的私有方法是获取不了的
Method method = cls.getMethod("haha");
method.invoke(o);//会报错NoSuchMethodException
// 2.通过获取所有方法包括私有方法
Method method2 = cls.getDeclaredMethod("haha");
// 2.1再打开私有方法权限
method2.setAccessible(true);
method2.invoke(o);//我是haha的私有方法
getDeclaredMethod()会获取所有的方法
setAccessible(true) 强行打开访问权限,通过反射获取私有方法。