java 中的反射:
反射:
在程序的运行状态中,对任意一个类 都能够获取它的属性 和方法;
对于任意一个对象,都能调用它的属性 和 方法;动态获取信息的方式,以及动态获取方法的功能称为Java的反射机制;
如何动态获取:
将Java源文件(.java) 编译成 字节码文件(.class), 然后在 获取对应的 类中方法属性;
正常:源文件编译过程:
- 通过反射 获取 当前对象 所对应的类:
1. 对象.getclass
2. 类.class
3 . 通过 类对应的路径 获取 Class.forName("com.yc123.demo.Base");
常用的一些 方法:
"获取类名:"+clazz.getSimpleName()
"获取全名:"+clazz.getName()
"获取访问修饰符:"+Modifier.toString(clazz.getModifiers())
"获取类所在的包路径:"+clazz.getPackage().getName()
- 通过反射 获取对象 所表示类 中的方法 :
Class teaCalss =对象.getClass();
1 .获取 公共的方法
Method[] methods = teaCalss.getMethods();
2 .获取 所有的方法
methods = teaCalss.getDeclaredMethods();
常用方法:
"访问修饰符号:"+Modifier.toString(clazz.getModifiers())
"方法名称:"+method.getName());
"方法返回值类型:"+method.getReturnType().getSimpleName());
"方法参数类型 列表:"+Arrays.asList(method.getParameterTypes());
通过反射的反射调用方法:
Method method = teaCalss.getDeclaredMethod("salary");
//开启 私有方法的调用
method.setAccessible(true);
//通过反射的反射 调用 该方法
method.invoke(tea);
- 通过反射获取对象 所表示类 所有接口/方法中的 指定的字段:
1 .获取 所有的字段
Field[] fiels = clazz.getDeclaredFields();
for (Field field : fiels) {
try {
System.out.println(field.get(对象));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
2 .获取 子类,接口,父类的公共字段
Field[] fiels = clazz.getFields();
常用方法:
"访问修饰符号:"+Modifier.toString(field .getModifiers())
"字段名称:"+field .getName());
"字段类型:"+field .getType());
"字段内容:"field .get(对象名);
- 通过反射类型实例化一个对象:
Eg:
Object stu = (强制转换类型) teaCalss.newInstance();
五.类加载器 :通过url类加载文件操作:
URL url = clazz.getClassLoader().getResource("text.docx");
//将文件 转换 为文件流操作
InputStream in = clazz.getClassLoader().getResourceAsStream("text.docx");
try {
//读取 缓冲区中的内容
byte[] buffer = new byte[in.available()];
//向指定长度 缓冲区中 读入数据
in.read(buffer);
System.out.println("new String(buffer)===>"+new String(buffer));
//关闭流操作
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}