反射机制在Java中是非常重要的一部分,它指的是可以在运行时加载、探知、使用编译期完全未知的类。
程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象。都能够调用它的任意一个方法和属性;
获得类对象的三种方式
1、Class.forName("全类名");
2、类名.class;
3、对象.getclass();
Class c = Class.forName("com.test.Person");
Class类是Reflection反射的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。
反射的具体实现
Person类的实现:
public class Person {
private String name;
private int age;
Person(String n, int a)
{
name = n;
age = a;
}
Person(){}
public static void staticFunc(){
System.out.println("我是静态方法。。。。。");
}
public void sayHello(){
System.out.println("hello"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
通过反射获取Person类的相关属性及方法:
public class EqualsTest {
public static void main(String[] args) throws Exception {
String path = "com.Test1.Person";
Class cl = Class.forName(path);
/*通过反射API调用构造器,构造对象*/
Person person = (Person) cl.newInstance();
person.setName("wgq");
person.sayHello();
/*通过反射API调用有参构造器,构造对象*/
Constructor<Person> c = cl.getDeclaredConstructor(String.class, int.class);
Person p1 = c.newInstance("张三",19);
p1.sayHello();
Method m1 = cl.getDeclaredMethod("staticFunc");
m1.invoke(p1);
}
}
执行:
hellowgq
hello张三
我是静态方法。。。。。
Class的常用方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
总结
反射机制在一些框架中被大量应用,虽然反射会导致执行效率变慢(通过反射调用方法比正常方法慢大约30倍,但是如果setAccessible(true)
忽略安全检查,速度比反射提高大约四倍),但是提高了开发效率。
网友评论