概述
反射其实就是类对象,类加载的产物;将类加载到内存中,会产生类对象(class文件);有了类对象,即可得到所有类资源的信息: 类,方法,属性,构造器,包,父类,接口...
创建类对象
可以通过三种方式获取类对象:1.类名.class 2.对象.getClass() 3.Class.forName("全限定名");
结论:无论哪种方式获取的类对象都是同一个类对象
//1.通过类名获取类对象
Class<?> c1 = Person.class; //<?>:通配所有类型,用在接收数据据时
Class c2 = new Person().getClass();
Class c3 = Class.forName("com.qf.f_reflect.Person");
System.out.println(c1==c2); //true
System.out.println(c1==c3); //true
常用方法
//反射的相关方法
Class c1 = Student.class; //获取反射对象
System.out.println("获取类名:"+c1.getName());
System.out.println("获取包名:"+c1.getPackage());
System.out.println("获取父类:"+c1.getSuperclass());
System.out.println("获取接口:"+Arrays.toString(c1.getInterfaces()));
//getField或getFields获取公开的属性的
System.out.println("获取属性:"+Arrays.toString(c1.getFields()));
//System.out.println("获取指定属性:"+c1.getField("name"));
//获取非空开属性;甚至放开权限后,私有的也可以获取
System.out.println("获取属性2:"+Arrays.toString(c1.getDeclaredFields())); //常用
System.out.println("获取方法:"+Arrays.toString(c1.getMethods())); //常用
//参数1:方法名 参数2:多个参数
System.out.println("获取指定方法:"+c1.getMethod("hi",String.class,int.class));
System.out.println("获取构造器:"+Arrays.toString(c1.getConstructors()));
System.out.println("实例化对象:"+c1.newInstance()); //(常用)
反射的应用
调属性
class Student {
public void hello(String name,int age) {
System.out.println("姓名:"+name+";年龄:"+age);
}
public void test() {
}
}
public class Test2 {
public static void main(String[] args) throws Exception {
//类对象调方法:
//1.获取类对象
Class c1 = Student.class;
//2.获取Method对象
Method method = c1.getMethod("hello", String.class,int.class);
//3.调用invoke方法
method.invoke(c1.newInstance(), "zs",33);
}
}
调方法
class Student {
public void hello(String name,int age) {
System.out.println("姓名:"+name+";年龄:"+age);
}
public void test() {
}
}
public class Test2 {
public static void main(String[] args) throws Exception {
//类对象调方法:
//1.获取类对象
Class c1 = Student.class;
//2.获取Method对象
Method method = c1.getMethod("hello", String.class,int.class);
//3.调用invoke方法
method.invoke(c1.newInstance(), "zs",33);
}
}
应用场景
反射应用,往往可以灵活动态的调用属性,方法,构造方法
在程序中,使用了反射,可以使程序的维护性更强
public class caogao {
public static void main(String[] args) throws Exception{
A a = Factory.getMsg(A.class, "zs", 13);
B b = Factory.getMsg(B.class, "ls", 14);
System.out.println(a+"=="+b);
}
}
class Factory{
public static<T> T getMsg(Class<T> c1,String name,int age) throws Exception {
Field field1 = c1.getDeclaredField("name");
Field field2 = c1.getDeclaredField("age");
field1.setAccessible(true);
field2.setAccessible(true);
T t = c1.newInstance();
field1.set(t, name);
field2.set(t, age);
Method method = c1.getMethod("a");
method.invoke(t);
return t;
}
}
class A {
String name ;
int age;
public void a() {
System.out.println("成功a");
}
@Override
public String toString() {
return "A [name=" + name + ", age=" + age + "]";
}
}
class B {
String name ;
int age;
public void a() {
System.out.println("成功b");
}
@Override
public String toString() {
return "B [name=" + name + ", age=" + age + "]";
}
}