java中final类型的值能不能被修改?
在c,c++中 我们可以通过指针直接修改内存的值,包括final修饰的,在java中不存在指针概念,但是java确留了一黑手:反射!!
反射能做什么?
1:通过反射能获得类名,包名等信息!
class2 = Person.class;
System.out.println("Demo2:(写法2) 包名: " + class2.getPackage().getName() + ","
+ "完整类名: " + class2.getName());
2:通过反射,可以通过Class,或者类名创建对象
public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
Class<?> class1 = null;
class1 = Class.forName("cn.lee.demo.Person");
//由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数哈~
Person person = (Person) class1.newInstance();
person.setAge(20);
person.setName("LeeFeng");
System.out.println("Demo3: " + person.getName() + " : " + person.getAge());
}
3:可以调用一个类的方法(包括私有方法)
public static void Demo7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException
{
Class<?> class1 = null;
class1 = Class.forName("cn.lee.demo.SuperMan");
System.out.println("Demo7: \n调用无参方法fly():");
Method method = class1.getMethod("fly");
method.invoke(class1.newInstance());
System.out.println("调用有参方法walk(int m):");
method = class1.getMethod("walk",int.class);
method.invoke(class1.newInstance(),100);
}
4:可以获取(修改)一个对象的属性
public static void Demo5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException
{
Person p=new Person();
//获得对象的 name属性
Field personNameField = p.getClass.getDeclaredField("name");
personNameField.setAccessible(true);
//获得字段类型
Class type=personNameField.getType();
//获得p对象的name字段的值,直接转换为String
String valueStr=personNameField.get(p).toString();
//重新复值给name
personNameField.set(obj, "胖虎先森");
}
5: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
public static void Demo6() throws ClassNotFoundException
{
Class<?> class1 = null;
class1 = Class.forName("cn.lee.demo.SuperMan");
//取得父类名称
Class<?> superClass = class1.getSuperclass();
Field[] fields = class1.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("类中的成员: " + fields[i]);
}
//取得类方法
Method[] methods = class1.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("Demo6,取得SuperMan类的方法:");
System.out.println("函数名:" + methods[i].getName());
System.out.println("函数返回类型:" + methods[i].getReturnType());
System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers()));
System.out.println("函数代码写法: " + methods[i]);
}
总结:反射就是java给程序猿留的一道后门,绝逼是java中最黑的科技!!常用于框架设计,修改系统变量值,典型使用是dex分包热修复框架中通过反射将系统classLoader dex包的给修改了!(细思极恐…)