Java反射机制 https://www.cnblogs.com/Eason-S/p/5851078.html
Class 这是一个类 他可以去得到其他类的引用,也就相当于得到其他类
三种方式获得类
Employee e = new Employee();
Class c1 = Class.forName(“Employee”);
Class c2 = Employee.Class;
Class c3 = e.getClass();
这三种方式都可以得到运行时的Employee类的引用(在堆中只有一个Employee,所以c1,c2,c3指向同一个引用地址)
利用反射机制的工厂模式
可变长参数
Class Student {
Public void add (int... a){
//这里可以把a当做数组用,去循环获取他的值
//可变长参数等同于数组,也就是说当我们调用的时候也可以传一个数组过去
a={1,2,3,4,5}
Add(a)
}
Public void add(int a){
//当有确定参数参数的同名函数时,会优先调用确定的参数
}
Public void add(int a,int...b){
//当出现可变参合确定参时,确定参时必须放在前面,可变参数在最后面
}
Public void add(int... a,int... b) //这种情况不允许出现,不能出现多个可变参
}
properties加载文件中的key value类型数据(对于属性文件是有要求的,必须按照要求写)
当然应该想把办法将文件中的key value 放在map或者set数据类型中。
反射机制中 怎么通过一个字符串去创建一个类对象
****通过反射机制获取类中的属性
//首先获取那个类。
Class c = Class.forName(“User”);
Field[] field = c.getFields(); // 这是获取那个public属性
Field[] field = c.getDeclaredFields(); //这是获取全部的属性方法。
Field field = c.getDeclaredField(String name) //里面传入一个属性名,然后或获取这个属性的应用 Field
//获取属性的类型和属性名
Class type = field.getType() //
Type.getSimpleName(); // 返回的是属性的数据类型 String int float之类的
Filed.getName() // 得到属性名
//获取属性前的修饰符 public private protected
Int i = Field.getmodifier(); //返回的是一个int类型的数据
String modify = Modifier.toString(i); // 返回修饰符 但是当里面有对个修饰符也可以返回,比如 里面有 public static
反射机制打破了封装性,导致不安全。***************重点***********
因为反射机制里面有一个方法可以打破封装然后可以去访问私有的属性
获取属性名为id的属性, idf.setAccessible(true);这就打破封装,然后就可以去对idf进行set和get方法的调用。 idf.set(o,”123”); idf.get(o);
................通过反射获取类中的方法Method
Method[] ms = c.getDeclareMethods(); //获取这个方法对象,然后这些有关于方法的属性都在里面
Class returnType = m.getReturnType(); // 返回类型是一个对象 获取返回类型
returnType.getSimpleName() //返回 返回类型 字符串
Modifier.toString(m.getModifiers()); //返回方法的修饰符
Class[] parameterType = m.getParameterTypes(); //获取参数列表 是一个对象
parameterType.getSimpleName(); //获取参列表的数据类型
通过反射调用里面的方法。
通过反射获取构造方法:
//获取无参构造方法的时候
Class c = Class.forName(“User”);
Object o = c.newInstance();
//获取有参构造方法需要传入参数,需要用一个类 Constructor
Constructor con = c.getDeclaredConstructor(“String.class”,”int.class”);
Object o = con.newInstance();
通过反射获取父类和父接口.
Class c = Class.forName(“User”);
Class superClass = c.getSuperClass(); //这是获取父类
superClass.getName(); //
Class[] superInters = c.getInterfaces() //获取父接口
superInters.getName(); //
反射机制的缺点:
反射机制打破了封装性,因为可以访问private里面的属性
反射机制的性能底,远不及直接去创建对象来的快。
反射机制会模糊程序内部的逻辑,对于程序的维护上是一个问题。