反射
1.什么是反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的法的功能称为java语言的反射机制。
2.反射机制有什么用
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
3.入门案例
Properties properties = new Properties();
properties.load(new FileInputStream("src\\day01\\re.properties"));
String classpath = properties.get("classpath").toString();
String method = properties.getProperty("method").toString();
//得到类对象
Class<?> aClass = Class.forName(classpath);
//得到实例化对象
Cat o =(Cat) aClass.newInstance();
//得到其中的方法
Method method1 = aClass.getMethod(method);
//调用方法
method1.invoke(o);
//properties里面的内容
classpath=day01.Cat
method=hi
//cat类里面的内容
public class Cat {
public void hi (){
System.out.println("hello,world");
}
}
4.反射主要使用的种类
5.Class类方法:
1.获取类名
import 新特性.泛型.泛型接口.test;
public class demo {
public static void main(String[] args) throws Exception {
Class<?> cl=test.class;
System.out.println(cl.getName());
System.out.println(cl.getSimpleName());
}
}
2.获取类中的所有方法
import java.lang.reflect.Method;
import 新特性.泛型.泛型类方法.test;
public class getMethod {
public static void main(String[] args) throws Exception {
//通过反射机制,获取Class,通过Class来实例化对象
Class<?> cl = test.class;
//通过getMethods方法获取所有public修饰的普通方法
Method[] methods = cl.getMethods();
for (Method i : methods) {
System.out.println(i.getName());
}
System.out.println();
//通过getDeclaredMethods返回类中所有的实例方法
Method[] methods1 = cl.getDeclaredMethods();
for (Method i : methods1) {
System.out.println(i.getName());
}
}
}
6.Field类方法
import java.lang.reflect.Field;
class Person{
public String name;
public int age;
}
class Student extends Person
{
public String school;
}
public class getField {
public static void main(String[] args) throws Exception{
Class<?> cl= Student.class;1
Field[] fields=cl.getFields();
//返回public修饰的所有属性
for (Field field:fields)
{
System.out.println(field.getName());
}
System.out.println();
//返回本类中的所有属性
Field[] fie=cl.getDeclaredFields();
for (Field field:fie)
{
System.out.println(field.getName());
}
//通过反射操作属性-----set/get方法
Object obj=cl.newInstance();
Field getFid=cl.getDeclaredField("school");
getFid.set(obj,"华润希望小学");
System.out.println(getFid.get(obj));
}
}
7.Method方法
import java.lang.reflect.Method;
class Person
{
private String name;
private int age;
private String sex;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
}
public class getMethod {
public static void main(String[] args) throws Exception {
//通过类名.class获取class对象
Class<?> cl=Person.class;
//实例划对象
Object o=cl.newInstance();
//通过getMethon方法取得setName这个方法的实例化对象,方法名称与参数类型
Method setMethod=cl.getMethod("setName", String.class);
//通过invoke调用方法
setMethod.invoke(o,"wangyang");
Method getMethod=cl.getMethod("getName");
Object result=getMethod.invoke(o);
System.out.println(result);
}
}