Java反射机制:
指在运行状态中,对于任意一个类,都能拿到这个类的所有属性和方法;对于任意一个对象,都能够使用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
可以直接理解为:反射可以实现在运行时可以知道任意一个类的属性和方法。
为什么要使用反射
首先要理解静态编译和动态编译
静态编译:在编译时就确定类型和对象
动态编译:在运行是才确定类型和对象,发挥了java的灵活性及多态的应用,动态创建对象和编译,一个应用可以在不卸载的情况下利用反射机制实现动态的编译,当然对性能也会有影响
class类
类是java.lang.Class 的实例,类又是class类的实例但是虽然能直接
String s = new String ("name")
创造一个实例 但是我们不能直接
Class c = new Class();因为构造器是私有的,只有虚拟机能创建Class对象,虽然我们不能new一个Class对象,但是可以通过有的类来得到这个创建的Class对象
先创建一个对象
class Animal{
String name;
String sex;
public String age;
public static void say(){
System.out.println("我能说人话!");
}
public void name(){
System.out.println("我的名字叫"+name);
}
Animal(){
}
Animal(String name,String sex,String age){
this.name = name;
this.sex = sex;
this.age = age;
}
}
public class Reflectt {
public static void main(String[] args) throws ClassNotFoundException {
}
获取Class 的三个方法:
1.通过类的静态变量class获取
2.知道完整类名,可以通过Class的forName静态方法直接获取
3已经有了实例,通过实例的静态方法getClass获取
Class clazz1 = Animal.class;
Class clazz2 = Class.forName("Animal");
Animal wc = new Animal();
Class clazz3 = wc.getClass();
System.out.println(clazz1+" "+clazz2+" "+clazz3);
//打印结果:class Animal class Animal class Animal
不想要前面带class可以直接给获取的类名.forName就没有class了
得到类后就可以获取类中几乎所有想要的了
通过类获取字段、方法、结构体
字段
Field [] fs = clazz1.getFields();//获取所有public的field字段包括父类的
Field f = clazz1.getField("age")//获得指定的field字段包括父类的;
Field [] fil = clazz1.getDeclaredFields();//获取当前类的public和private字段
Field file = clazz1.getDeclaredField("age");//获得当前类指定的public和private的field
//遍历字段数组
for (Field ff:fds) {
System.out.println(f);
}
Method [] fil = clazz1.getDeclaredMethods();//获取当前类的public和private字段
Method file = clazz1.getDeclaredMethod("name");//获得当前类指定的public和private的Method
Method [] fs = clazz1.getMethods();//获取所有public的Method字段包括父类的
Method f = clazz1.getMethod("say");//获得指定的Method字段包括父类的;
//
//Method d = str.getClass().getMethod("substring", int.class);
//嗲用这个方法并且打印 System.out.println( d.invoke(str,2));
//因为我自己写的写的方法少这里举个例字:这个是调用String 里面的substring ,前面写要掉的方法,后面// //填写参数
f.invoke(wc);//调用方法,第一个参数为实例,如果是静态方法的话,实例位置填写 null,后面填写参数
//编辑器可能会报错,要有个try catch捕获异常
//遍历同上 Field改为MeThod
结构体
Constructor [] constr = String.class.getDeclaredConstructors();
Constructor cl = String.class.getDeclaredConstructor(String.class);
Constructor con = clazz1.getConstructor(Dog.class);
Constructor c = String.class.getConstructors();//带s和不带s的字段,方法的一样
//创建方法实例
Constructor[] cons = clazz1.getConstructors();
Dog mm = (Dog) con.newInstance("f","fd","fsd");
,还可以获取很多例如接口,父类等等,这里就不介绍了,一般初学这个先掌握这些,再慢慢进阶