加入收藏 | 设为首页 | 会员中心 | 我要投稿 葫芦岛站长网 (https://www.0429zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java借助反射对类的hidden成员方法和属性的访问

发布时间:2021-11-24 13:36:17 所属栏目:教程 来源:互联网
导读:Java中通过访问控制符来控制对类成员的访问,private 成员表示只在类的内部才可以被访问,但是利用java的反射机制却可以再类的外部来访问类的私有成员 下面是个简单的例子来说明这一点 package com.eric.reflect; import java.lang.reflect.Field; import java

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 {  
       <pre name="code" class="java">       //私有属性,正常情况下外部类不可以访问此方法  
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: $ */
 
 

(编辑:葫芦岛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!