反射 reflection
Class jvm中 用来 管理类的 类
怎样获取一个类的Class对象?
1、类名.class
2、对象.getClass()
3、Class.forName("包名.类名"); 异常 处理
Class 对象是单例的
能通过Class对象取到该类中的
包、类名、父类、接口、属性、方法、构造方法
能取所有的,也能取到public,还能取某个特定的
反射有啥用?
1、破坏封装
2、今天调用明天的代码 解耦和
基本使用如下:
package XXX;
public class TestRef01
{
public static void main(String[] args)
throws ClassNotFoundException
{
//获取Person类的 Class对象
Class c1 = Person.class;
Person p = new Person();
Class c2 = p.getClass();
Class c3 = Class.forName("com.itany.coreJava.day19.Person");
//Class对象是单例 的
System.out.println(c1 == c2);
System.out.println(c1 == c3);
System.out.println(c2 == c3);
// 获取类的包
Package pck = c1.getPackage();
System.out.println(pck.getName());
// 获取类的名字
// 包名.类名
System.out.println(c1.getName());
//类名
System.out.println(c1.getSimpleName());
// 获取父类的简单类名
System.out.println(c1.getSuperclass().getSimpleName());
//获取接口
Class[] interfaces = c1.getInterfaces();
for (Class c : interfaces)
{
System.out.println(c.getSimpleName());
}
//获取属性public
Field[] fs = c1.getFields();
for (Field f : fs)
{
System.out.println(f.getName());
}
// 反射 1、破坏封装
// 获取所有的属性
Field[] allFs = c1.getDeclaredFields();
//
System.out.println("all fields ............");
for (Field f : allFs)
{
System.out.println(f.getName());
}
//获取构造方法public
Constructor[] cons = c1.getConstructors();
System.out.println(cons.length);
//获取所有的构造方法
Constructor[] allCons = c1.getDeclaredConstructors();
System.out.println(allCons.length);
System.out.println("methods.........................");
// 获取方法
// 所有public方法,包括父类 或者 父接口中的
Method[] ms = c1.getMethods();
Method[] allMs = c1.getDeclaredMethods();
for (Method m : ms)
{
System.out.println(m.getName());
}
}
}