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) { }}
//提供一个外部能访问的方法 public void isUseFun1(Object obj) ==----------== 这样不行啊,别人不会老老实实传入this的,别人只要这样一传就绕过去了:isUseFun1(new com.abc.b.c.Biz())//随便传入一个能使你正确判别的对象就行了。
protected 只允许同一个包中的和不同包中的子类访问
default 只允许同一个包中的类访问
private 只允许自己访问
但是你的范围,又不是protected限制描述的范围,
所以我觉得,很难至少缺少一个通用的简洁办法。
因为人家想访问它,Biz又是public的,那么只要继承一下,就访问到了。
那么可能要求你加个final限制可以吗?然后在你允许访问的Package里面,加上这个类的访问Proxy类
.getPropertyType(); Package pkg = propertyType.getPackage();获取来访问的包名,截取字符串,调用前截取字符串调对比
可以啊。
我提供一个纯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("不允许使用");
}
}
}
以上仅供楼主参考
输出
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)
使用Spring 是可以控制的
使用代理就可以获得访问的方法签名
{//提供一个外部能访问的方法
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)
{
}}
public void isUseFun1(Object obj) ==----------==
这样不行啊,别人不会老老实实传入this的,别人只要这样一传就绕过去了:isUseFun1(new com.abc.b.c.Biz())//随便传入一个能使你正确判别的对象就行了。
VALUE为需要访问方法或者类的信息以后要调用该方法,就通过枚举的东西在MAP里找找到了,反射该方法
那如何控制:哪些人允许实现该接口(如:com.abc包),哪些人不允许实现该接口(如:com.xyz包)呢?