创建一个类的实例,修改类中定义为private的变量的值
2015-12-26 01:27
381 查看
import java.lang.reflect.*; /** * public class ReadOnlyClass{ * private String name = "hello"; * public String getName(){ * return name; * } *创建ReadOnly的实例,能否将name的值改为world *可以实现 通过反射 **/ class ReadOnlyClass { public static void main(String[] args) { ReadOnly roc = null; try { //通过Class类中静态方法forName获得ReadOnly的字节码文件 Class c = Class.forName("ReadOnly"); //获的ReadOnly类的无参构造方法 Constructor cons = c.getDeclaredConstructor(); if(!cons.isAccessible()){ cons.setAccessible(true); } //通过无参构造方法创建实例 roc = (ReadOnly)cons.newInstance(); //roc = (ReadOnly)c.newInstance();//如果构造函数私有化,则该方法抛出IllegalAccessException //获得类中name成员变量 Field f = c.getDeclaredField("name"); if(!f.isAccessible()) f.setAccessible(true); f.set(roc,"world"); System.out.println(f.get(roc)); //获得类中show方法 Method m = c.getDeclaredMethod("show"); if(!m.isAccessible()) m.setAccessible(true); m.invoke(roc); //获取全部成员变量 Field[] fields = c.getDeclaredFields(); System.out.println(c.getName()+"中存在的成员变量有"+fields.length+"个,具体情况如下:"); for(int i = 0; i< fields.length; i++){ System.out.println(fields[i]); } //获取全部方法 Method[] methods = c.getDeclaredMethods(); System.out.println(c.getName()+"中存在的方法有"+methods.length+"个,具体情况如下:"); for(Method method : methods){ StringBuffer sb = new StringBuffer(); Type[] types = method.getGenericParameterTypes(); for(int i =0; types.length > 0 && i < types.length;i++){ if(i < types.length-1 ){ sb.append(types[i]+","); }else{ sb.append(types[i]); } } System.out.println("方法声明:"+Modifier.toString(method.getModifiers())+" "+method.getReturnType()+" " +method.getName()+"("+sb.toString()+")"); } } catch (Exception e) { e.printStackTrace(); } } } class ReadOnly { //私有化了构造函数 private ReadOnly(){} //私有化成员变量 private String name = "hello"; //私有化的静态成员变量 private static final String TAG = "这是我的标签"; //公开的访问变量的方法 public String getName(){ return name; } //私有的成员方法 private void show(){ System.out.println("private method show------"); } //私有化的静态方法 private static void main(String str,int i,Class clazz){ System.out.println("private static method main"+str); } }
相关文章推荐
- Java反射随记
- AS3中的反射(速记) 分析
- Ruby简明教程之方法(Method)介绍
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- 传智播客学习之java 反射
- IE7下ajax之open Method New的说明
- Java 反射之私有字段和方法详细介绍
- php使用反射插入对象示例分享
- java反射使用示例分享
- java利用反射实现动态代理示例
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
- django自定义Field实现一个字段存储以逗号分隔的字符串