Java中利用反射对类的hidden成员方法和属性的访问
2012-02-07 21:43
555 查看
java中通过访问控制符来控制对类成员的访问,private 成员表示只在类的内部才可以被访问,但是利用java的反射机制却可以再类的外部来访问类的私有成员
下面是个简单的例子来说明这一点
package com.eric.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*
* this class mainly for explain how to access hidden method or field
*
*
*
* archive $ProjectName: $
*
* @author Admin
*
* @version $Revision: $ $Name: $
*/
public class AccesHiddenElements {
public static void main(String[] args) {
Inter inter = new InterImpl();
inter.f();
if (inter instanceof InterImpl) {
// use class cast to method that in InterImpl class
((InterImpl) inter).g();
// can't access h method
// ((InterImpl) inter).h();
}
// (1)javap -private InterImpl to get all method name eg h()
// (2)use reflect to access private method
accessMehodByName(inter, "h");
accessFieldByName(inter, "name");
Inter annousInter = new Inter() {
public void f() {
System.out.println("f() method in annousInter");
}
private void g() {
System.out.println("g() method in annousInter");
}
};
accessMehodByName(annousInter, "g");
}
static void accessMehodByName(Object obj, String methodName) {
try {
Method method = obj.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
static void accessFieldByName(Object obj, String methodName) {
try {
Field field = obj.getClass().getDeclaredField(methodName);
field.setAccessible(true);
System.out.println(field.getInt(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}
interface Inter {
public void f();
}
class InterImpl implements Inter {
private int name = 10;public void f() {System.out.println("f() in InterImpl");}public void g() {System.out.println("g() in InterImpl");} //私有方法,正常情况下外部类不可以访问此方法private void h() {System.out.println("h() in InterImpl");}}/* * * History: * * * * $Log: $ */
下面是个简单的例子来说明这一点
package com.eric.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*
* this class mainly for explain how to access hidden method or field
*
*
*
* archive $ProjectName: $
*
* @author Admin
*
* @version $Revision: $ $Name: $
*/
public class AccesHiddenElements {
public static void main(String[] args) {
Inter inter = new InterImpl();
inter.f();
if (inter instanceof InterImpl) {
// use class cast to method that in InterImpl class
((InterImpl) inter).g();
// can't access h method
// ((InterImpl) inter).h();
}
// (1)javap -private InterImpl to get all method name eg h()
// (2)use reflect to access private method
accessMehodByName(inter, "h");
accessFieldByName(inter, "name");
Inter annousInter = new Inter() {
public void f() {
System.out.println("f() method in annousInter");
}
private void g() {
System.out.println("g() method in annousInter");
}
};
accessMehodByName(annousInter, "g");
}
static void accessMehodByName(Object obj, String methodName) {
try {
Method method = obj.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
static void accessFieldByName(Object obj, String methodName) {
try {
Field field = obj.getClass().getDeclaredField(methodName);
field.setAccessible(true);
System.out.println(field.getInt(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}
interface Inter {
public void f();
}
class InterImpl implements Inter {
//私有属性,正常情况下外部类不可以访问此方法
private int name = 10;public void f() {System.out.println("f() in InterImpl");}public void g() {System.out.println("g() in InterImpl");} //私有方法,正常情况下外部类不可以访问此方法private void h() {System.out.println("h() in InterImpl");}}/* * * History: * * * * $Log: $ */
相关文章推荐
- 【转载】JAVA利用反射机制访问private成员和方法
- java利用反射访问类的私有(private)属性及方法
- java利用反射访问类的私有(private)属性及方法
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java反射之访问私有属性或方法
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 反射访问成员属性
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- 类反射学习(三) JAVA如何利用类反射调用普通函数、访问成员成员变量
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java反射之访问私有属性或方法
- Java反射之访问私有属性或方法
- java反射-访问private属性和方法
- java中用反射访问私有方法和私有成员[转]
- java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表
- Java记录 -88- 利用反射机制调用对象的私有方法和属性