我有能力运行代码,让我进行计算和/或从程序中获取变量信息。然而,我没有访问基本代码,并想知道是否有一种方法打印出所有的方法一个对象有可用的(公共)?
类Shape的例子,有Circle和Square的子类。如果我能够打印出Circle的方法,我可能会看到:
.getRadius()
.setRadius(newValue)
但是Square会有
.getSide()
.setSide(newValue)
我有一个myObject,我知道我可以得到
myObject[1].GetLength()
myObject[1].getDimUom()
myObject[1].getQuantity().getValue()
然而,我不知道我只能设置某些东西,比如(通过试错)
myObject[1].setClass(newValue)
所以我希望能够找到一种方法从对象中打印出方法名;同样,没有任何能力查看或修改基本代码(如添加反射)
你要做的基本上是打破信息隐藏原则,这是OOP中最基本的原则。
你(最有可能)真正想要的是定义一个通用行为,它可以被子类以特定的方式实现。关于您的示例,这可能是在接口中定义的方法changeSizeTo(int newValue)
,该方法将由您的类实现,每个类将执行特定的操作。
关键不在于实际的访问修饰符,而在于问题:"这是否强制调用者知道这个对象实际上是哪个子类?">我的意思是任何公开的东西都是隐藏的吗?- - -爱德华。
解决方案
你可以使用反射
Class clazz = circle.getRadius().getClass();
Method[] methods = clazz.getMethods();
for ( Method method : methods ) {
System.out.println( method.getName() );
}
话虽如此,你应该听听@Timothy Truckle给出的建议。如果您需要使用它,那么很可能会遇到设计问题,假设您不是在编写框架或库