反射介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制,可以实现以下功能:
①在运行时判断任意一个对象所属的类。
②在运行时构造任意一个类的对象。
③在运行时判断任意一个类所具有的成员变量和方法。
④在运行时调用任意一个对象的方法。
⑤生成动态代理。
获取源头Class
所有类的对象其实都是Class的实例。 这个Class实例可以理解为类的模子,就是包含了类的结构信息,类似于图纸。
获取Class对象(三种方式)
①Class.forName(”包名.类名”) (推荐使用)
②类.class
③对象.getClass()
例:
public class ReflectTest002 {
public static void main(String[] args) {
ReflectTest002 f=new ReflectTest002();
//通过对象获取包名、类名
Class<?> cls = f.getClass();
System.out.println(cls.getName());
//com.shsxt.refulect.ReflectTest002
//通过类获取类名、类名
Class<?> cls1 =ReflectTest002.class;
System.out.println(cls1.getName());
//com.shsxt.refulect.ReflectTest002
//可以不用通过new对象来获取
//通过Class.forName(包名.类名)方法获取包名、类名
Class<?> cls2=Class.forName("com.shsxt.refulect.ReflectTest002");
System.out.println(cls2.getName());
//com.shsxt.refulect.ReflectTest002
}
}
获取修饰符
public class ReflectTest002 {
public static void main(String[] args) {
//通过Class.forName(包名.类名)方法获取包名、类名
Class<?> cls2=Class.forName("com.shsxt.refulect.ReflectTest002");
System.out.println(cls2.getName());
//com.shsxt.refulect.ReflectTest002
//通过getModifiers()方法获取权限修饰符(int 类型)
int m = cls2.getModifiers();
System.out.println(m);//1
//通过Modifier.toString(int类型权限修饰符)方法转为字符串类型
String str=Modifier.toString(m);
System.out.println(str);//public
}
}
创建对象
获取构造器
setAccessible(true) 打开私有内容的权限
例:
Reflect001类
public class Reflect001 {
private String name;
private int age;
public Reflect001() {
}
private Reflect001(String name) {
this.name = name;
}
public Reflect001(int age) {
this.age = age;
}
public void add(){
System.out.println("敲代码");
}
public void fun(){
System.out.println("不停的敲代码");
}
}
测试 Reflect001类
public class ReflectTest003 {
public static void main(String[] args) throws Exception {
Class<?> cls=Class.forName("com.shsxt.refulect.Reflect001");
//获取所有的public权限的构造器
Constructor<?>[] con=cls.getConstructors();
//遍历获取的构造器数组
for (Constructor<?> con1:con)
System.out.println(con1);
System.out.println("===============================");
//获取所有的构造器
con=cls.getDeclaredConstructors();
for (Constructor<?> con2 : con) {
System.out.println(con2);
}
System.out.println("===============================");
//获取指定的构造器
Constructor<?> cos=cls.getConstructor(int.class);
System.out.println(cos.getName());
System.out.println("===============================");
//获取非公开权限的构造器
cos=cls.getDeclaredConstructor(String.class);
System.out.println(cos.getName());
}
}
实例化对象(重点)
创建对象的方式,有new 、克隆、反序列化,再加一种,根据Class对象,使用newInstance()创建此Class对象所表示的类的一个新实例 或者构造器实例化对象。
例:
Reflect001类
public class Reflect001 {
private String name;
private int age;
public Reflect001() {
}
private Reflect001(String name) {
this.name = name;
}
public Reflect001(int age) {
this.age = age;
}
public void add(){
System.out.println("敲代码");
}
public void fun(){
System.out.println("不停的敲代码");
}
}
测试 Reflect001类
public class ReflectTest004 {
public static void main(String[] args) throws Exception {
//通过newInstance实例化对象,获取空构造函数(方法)
//获取源头
Class<?> cls = Class.forName("com.shsxt.refulect.Reflect001");
//通过newInstance创建对象 调用空构造
Reflect001 reflect002 = (Reflect001) cls.newInstance();
//调用Reflect001源头中的方法
reflect002.add();//敲代码
reflect002.fun();//不停的敲代码
System.out.println("=================");
//通过getDeclaredConstructors()创建对象,获取全部的构造函数(方法)
Constructor<?>[] cls1=cls.getDeclaredConstructors();
//遍历获取到的构造函数数组
for (Constructor<?> con : cls1) {
System.out.println(con);
/* public com.shsxt.refulect.Reflect001(int)
private com.shsxt.refulect.Reflect001(java.lang.String)
public com.shsxt.refulect.Reflect001()
*/
}
}
}
注意:newInstance()是调用空构造,如果空构造不存在,会出现异常。
父类与接口
例:
public class ReflectTest005 {
public static void main(String[] args) throws Exception{
Class<?> cls=Class.forName("com.shsxt.refulect.Son");
//获取父类
Class superCls=cls.getSuperclass();
System.out.println(superCls);
//获取接口
Class[] interCls=cls.getInterfaces();
//打印数组长度
System.out.println(interCls.length);
//遍历数组
for (Class inter : interCls) {
System.out.println(inter);
}
}
}
class Father{
public String name;
}
interface FatherIn1{
void son();
}
interface FatherIn12{
void fun();
}
class Son extends Father implements FatherIn1,FatherIn12{
private int age;
private Integer name;
@Override
public void son() {
System.out.println("一直敲代码");
}
@Override
public void fun() {
System.out.println("活动、活动");
}
}
属性和方法
属性
例:
public class ReflectTest006 {
public static void main(String[] args) throws Exception{
Class<?> cls=Class.forName("com.shsxt.refulect.Son");
//获取属性
System.out.println("==============本类属性==============");
//获取本类的全部属性
Field[] field=cls.getDeclaredFields();
//遍历数组
for (Field getFie : field) {
//获取权限修饰符(int 类型)
int con=getFie.getModifiers();
//int类型修饰符转String类型
String str= Modifier.toString(con);
System.out.println(str);//private private
//获取属性类型
Class<?> type=getFie.getType();
//获取属性名
String name=getFie.getName();
System.out.println(str + " " + type + " " + name);
}
System.out.println("======公开的属性包括接口或者父类属性======");
Field[] field1=cls.getFields();
for (Field name1 : field1) {
System.out.println(name1);
}
}
}
方法
例:
public class ReflectTest007 {
public static void main(String[] args) throws Exception{
Class<?> cls = Class.forName("com.shsxt.refulect.Son");
System.out.println("============本类方法============");
//取得全部公共方法
Method[] methodCls=cls.getMethods();
//遍历数组
for (Method name : methodCls) {
System.out.println(name);
//获取方法权限(int 类型)
int getMod = name.getModifiers();
//int类型权限转String类型
String con= Modifier.toString(getMod);
System.out.println(con);
//获取返回类型
Class<?> type=name.getReturnType();
System.out.println(type);
//获取名字
String clsName=name.getName();
System.out.println(clsName);
//获取参数
Class<?>[] pare=name.getParameterTypes();
for (int i = 0; i < pare.length; i++) {
Class<?> p=pare[i];
System.out.println(p);
}
}
}
}
数组
例:
public class ReflectTest008 {
public static void main(String[] args) {
//创建数组
Object obj= Array.newInstance(int.class,5);
//获取大小
if (obj.getClass().isArray()) {//判断是否为数组
System.out.println("数组长度:"+Array.getLength(obj));
//数组长度:5
//设置值
Array.set(obj, 1,11);
//获取值
System.out.println(Array.get(obj, 1));//11
//Object强转int类型
int[] arr1=(int[]) obj;
for (int arr : arr1) {
System.out.println(arr);//0 11 0 0 0
}
}
}
}