本帖最后由 jt6 于 2009-11-19 15:59:29 编辑

解决方案 »

  1.   

    public 所有包和子包都能访问
    protected 只允许同一个包中的和不同包中的子类访问
    default 只允许同一个包中的类访问
    private 只允许自己访问
      

  2.   

    如果是包的话,最好是在protected上面下功夫了,
    但是你的范围,又不是protected限制描述的范围,
    所以我觉得,很难至少缺少一个通用的简洁办法。
    因为人家想访问它,Biz又是public的,那么只要继承一下,就访问到了。
    那么可能要求你加个final限制可以吗?然后在你允许访问的Package里面,加上这个类的访问Proxy类
      

  3.   

    哦,Sorry,不够严谨了我还得再想想。
      

  4.   

    http://topic.csdn.net/t/20060812/15/4945099.html参考下,顺便做标记,楼主要是解决了共享下啊
      

  5.   

    http://topic.csdn.net/t/20060812/15/4945099.html参考下,顺便做标记,楼主要是解决了共享下啊
      

  6.   

    做不到,只有在 JDK 7 可以做到,JDK 7 中有 superpackage 这个概念,可以导出一些包。
      

  7.   

    Class<? extends Object> propertyType = propertyDescriptor
    .getPropertyType(); Package pkg = propertyType.getPackage();获取来访问的包名,截取字符串,调用前截取字符串调对比
      

  8.   

    学习甘草兄弟严谨的精神了。莫非是把这个Biz类代码mail给要用的项目组,让ta粘贴在自己项目里面...
      

  9.   


    可以啊。
    我提供一个纯java做法
    代码如下(已测试成功)package com.abc.b.c;public class Biz { //该方法只能让com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法
    public void fun1(Object[] params)
    {
    //首先获取该方法的调用者的类的完整名称
    StackTraceElement stack[] = (new Throwable()).getStackTrace(); 
    String callerPathName=stack[1].getClassName();//这是调用者的类名
    //判是否是允许的指定包:com.abc包及其下级包、cn.abc包及其下级包
    if(callerPathName.startsWith("com.abc")||callerPathName.startsWith("cn.abc"))
    {
    System.out.println("允许使用");
    }
    else
    {
    System.out.println("不允许使用");
    }

    }



    }
    以上仅供楼主参考
      

  10.   

    看起来crazylaa 提出的办法可行,可以!虽然说任何人都可以写个cn.abc.Test来调用Biz.fun1()其实也不是很安全。
    输出
    0:java.lang.Thread.getStackTrace(Thread.java:1426)
    1:com.abc.b.c.B.whocall(B.java:7)
    2:cn.abc.test.pack1.A.<init>(A.java:8)
    3:cn.abc.test.Test.main(Test.java:7)
      

  11.   

      顺便问下类对象能不能了解此时访问自己的是什么对象 
         使用Spring 是可以控制的
          使用代理就可以获得访问的方法签名
      

  12.   

    public class BIz
    {//提供一个外部能访问的方法
    public void isUseFun1(Object obj)
    {
       Class class = obj.getClass();
       if(class.getClassName().startsWith("com.abc")||class.getClassName().startsWith("cn.abc"))
      {
        fun1(Object[] params);
      }
      else
      {
       return;
      }}//设为私有的
    private void fun1(Object[] params)
    {
    }}
      

  13.   

    //提供一个外部能访问的方法
    public void isUseFun1(Object obj) ==----------==
    这样不行啊,别人不会老老实实传入this的,别人只要这样一传就绕过去了:isUseFun1(new com.abc.b.c.Biz())//随便传入一个能使你正确判别的对象就行了。
      

  14.   

    写一个枚举,枚举出对应的访问限制或者权限在写一个类,拥有线程安全的返回MAP的静态方法,MAP里KEY为枚举的东西,
    VALUE为需要访问方法或者类的信息以后要调用该方法,就通过枚举的东西在MAP里找找到了,反射该方法
      

  15.   

    纯Java解决方法:给个标记接口即可。
      

  16.   


    如何控制:哪些人允许实现该接口(如:com.abc包),哪些人不允许实现该接口(如:com.xyz包)呢?