求教:类方法访问限制,“朋友”才可访问

jt6 2009-11-19 03:56:12
我有个类com.abc.b.c.Biz,其中有一个方法fun1(Object[] params),想限制只能是com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法,求教怎么做?纯java做法、框架做法都要得!

顺便问下类对象能不能了解此时访问自己的是什么对象?
...全文
271 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
jt6 2009-11-29
  • 打赏
  • 举报
回复
谢谢,谢4楼、5楼二位帮顶,10楼给出做法,19楼便是其代码。
StackTraceElement stack[]= (new Throwable()).getStackTrace();
15楼这位虽不能解决但PropertyDescriptor类值得研究。
.\pack2\pack2_1\B.java:11: 无法从静态上下文中引用非静态 方法 getPropertyType().getPropertyType();
jt6 2009-11-29
  • 打赏
  • 举报
回复
前几天做了个系统还原,密码记不住了,一直没上来,嘿嘿。偶然找回来了,马上就结。对不住。
谢谢楼上各位指点。
Dan1980 2009-11-20
  • 打赏
  • 举报
回复
纯Java解决方法:给个标记接口即可。
bunrise 2009-11-20
  • 打赏
  • 举报
回复
写一个枚举,枚举出对应的访问限制或者权限

在写一个类,拥有线程安全的返回MAP的静态方法,MAP里KEY为枚举的东西,
VALUE为需要访问方法或者类的信息

以后要调用该方法,就通过枚举的东西在MAP里找

找到了,反射该方法
yilagong 2009-11-20
  • 打赏
  • 举报
回复
这样,你可以做个角色判段,把你的朋友赋给这种角色,有这个角色就可以访问你所要的东西了。
云上飞翔 2009-11-20
  • 打赏
  • 举报
回复
//提供一个外部能访问的方法
public void isUseFun1(Object obj)

==----------==
这样不行啊,别人不会老老实实传入this的,别人只要这样一传就绕过去了

isUseFun1(new com.abc.b.c.Biz())//随便传入一个能使你正确判别的对象就行了。
lgm277531070 2009-11-20
  • 打赏
  • 举报
回复
让那些要访问方法的类都设置一个独特的属性,在访问方法的时候判断类是否具有那个属性,有则正常访问没有就抛出个异常来
handsomezhj 2009-11-20
  • 打赏
  • 举报
回复
不会。。。。。。。。。
云上飞翔 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 dan1980 的回复:]
纯Java解决方法:给个标记接口即可。
[/Quote]

如何控制:哪些人允许实现该接口(如:com.abc包),哪些人不允许实现该接口(如:com.xyz包)呢?
zhouyongyang 2009-11-19
  • 打赏
  • 举报
回复
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)
{
}

}
zhouyongyang 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jiangnaisong 的回复:]
引用楼主 jt6 的回复:
我有个类com.abc.b.c.Biz,其中有一个方法fun1(Object[] params),想限制只能是com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法,求教怎么做?纯java做法、框架做法都要得!

顺便问下类对象能不能了解此时访问自己的是什么对象?



可以啊。
我提供一个纯java做法:
代码如下(已测试成功)
Java codepackage com.abc.b.c;publicclass Biz {//该方法只能让com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法publicvoid 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("不允许使用");
}

}



}
以上仅供楼主参考
[/Quote]

真是个好办法啊
zhouyongyang 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiesisi3 的回复:]
public 所有包和子包都能访问
protected 只允许同一个包中的和不同包中的子类访问
default 只允许同一个包中的类访问
private 只允许自己访问
[/Quote]

UP
sangshusen_1988 2009-11-19
  • 打赏
  • 举报
回复
太有难度了
laker_914 2009-11-19
  • 打赏
  • 举报
回复
支持一下
huangqibing0626 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jiangnaisong 的回复:]
引用楼主 jt6 的回复:
我有个类com.abc.b.c.Biz,其中有一个方法fun1(Object[] params),想限制只能是com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法,求教怎么做?纯java做法、框架做法都要得!

顺便问下类对象能不能了解此时访问自己的是什么对象?



可以啊。
我提供一个纯java做法:
代码如下(已测试成功)
Java codepackage com.abc.b.c;publicclass Biz {//该方法只能让com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法publicvoid 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("不允许使用");
}

}



}
以上仅供楼主参考
[/Quote]

值得借鉴
云上飞翔 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 closewbq 的回复:]
所谓不能用,就不能调用。我汗。。。
[/Quote]

楼主的目的其实并不是能不能调用(这是编译期的检查),而是非允许调用者,不给它执行相应的功能(运行期检查)。
  • 打赏
  • 举报
回复
关注中
closewbq 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jiangnaisong 的回复:]
引用楼主 jt6 的回复:
我有个类com.abc.b.c.Biz,其中有一个方法fun1(Object[] params),想限制只能是com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法,求教怎么做?纯java做法、框架做法都要得!

顺便问下类对象能不能了解此时访问自己的是什么对象?



可以啊。
我提供一个纯java做法:
代码如下(已测试成功)
Java codepackage com.abc.b.c;publicclass Biz {//该方法只能让com.abc包及其下级包、cn.abc包及其下级包才可以使用此方法publicvoid 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("不允许使用");
}

}



}
以上仅供楼主参考
[/Quote]
所谓不能用,就不能调用。我汗。。。
bolink5 2009-11-19
  • 打赏
  • 举报
回复
顺便问下类对象能不能了解此时访问自己的是什么对象
使用Spring 是可以控制的
使用代理就可以获得访问的方法签名
jt6 2009-11-19
  • 打赏
  • 举报
回复
看起来crazylaa 提出的办法可行,可以!虽然说任何人都可以写个cn.abc.Test来调用Biz.fun1()其实也不是很安全。
[Quote=引用 10 楼 crazylaa 的回复:]
http://topic.csdn.net/t/20060812/15/4945099.html

参考下,顺便做标记,楼主要是解决了共享下啊
[/Quote]
输出
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)
加载更多回复(20)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧