一、反射机制:
概述:反射是java中的动态机制,它允许我们实例化对象,调用方法或属性。从原来的编码期确定转为在程序运行期决定。这大大的增加了程序的灵活度。反射提高了灵活度,但是会降低性能。因此适度使用。
Class类:
Class类的每一个实例用于表示JVM加载的类。所以我们也称其为:“类的对象”。
概述:JVM加载的每个类都有且只有唯一的一个Class实例与之对应。我们可以获取某个类的类对象。
通过它我们可以得知该类的一切信息(类名,有哪些属性,哪些方法等)。甚至可以动态实例化这个类的实例,并调用它的属性和方法。
应用:获取一个类的类对象有以下几种方式:
1:每个类都有一个静态属性class。用于获取该类的类对象。我们确定要获取某个类的对象时,可以用这种方式。但由于是通过编码调用,所以不灵活。
Class cls = String.class;
Class cls = int.class;
2:调用Class的静态方法:forName(String name),该方法要求传入要加载的类的完全限定名(包名.类名)
Class cls = Class.forName("java.util.String");
3:使用类加载器:ClassLoader
以下为测试代码
加载String
try{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要加载的类的名字:");
String className = scanner.nextLine();
Class cls = Class.for(calssName);
Method [] method = cls.getDeclaredMethods();
for(Method allMethod: method) {
System.out.println(allMethod.getName());
}
//以下为测试代码(唯一性)
Class cls1 = Class.forName("java.util.String");
Class cls2 = Class.forName("java.util.String");
System.out.println(cls1==cls2)//true.JVM加载的每个类都有且只有唯一的一个Class实例与之对应
//以下为测试代码(获取当前类的方法)
//Method [] methods = cls1.getMethods();//获取当前类的所有方法,包含从超类继承的
Method [] methods = cls1.getDeclaredMethods();//获取所有的方法,只包含当前类自己定义的方法
for(Method method : methods){
System.out.prontln(method.getName());
}catch(ClassNotFoundException e){
e.printStackTrace()
}
}