我有一个带有公共方法的基类。
`public class ClassA {
private int a;
public void setA() {
a = 15;
System.out.println(a);
}
}`
然后,有一个扩展ClassA的ClassB,
`public class ClassB extends ClassA {
public void test() {
setA();
}
}`
现在,在main()
中,我创建了一个ClassB实例。实例无法访问方法setA()
和test()
。
`public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
obj.setA(); //Not Accessible
obj.test(); //Not Accessible
}`
有人可以告诉我哪里出错了吗?
答案 0 :(得分:0)
正如评论中已经回答的那样,您应该将obj转换为Class:
public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
((ClassB) obj).setA();
((ClassA) obj).setA();
((ClassB) obj).test();
}
答案 1 :(得分:0)
您正在通过调用BuiltinFormats
创建新的Object
。但是,由于我们确定返回的对象将是我们想要的类,我们可以毫无问题地进行转换:
cls.newInstance()
如果没有转换为ClassB,返回的对象将被视为public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
Class<?> cls = ClassB.class;
ClassB obj = (ClassB)cls.newInstance();
obj.setA(); //Accessible now
obj.test(); //Accessible now
}
,因此只包含由其定义的methods。
但是,正如大多数评论已经说过,使用new
运算符简单地创建类型的新实例通常要容易得多:
java.lang.Object
答案 2 :(得分:0)
您可以使用ClassB obj = new ClassB();
您可以尝试这样的事情:
ClassB obj = new ClassB();
obj.setA(); //Accessible
obj.test(); //Accessible
或者,为了进一步改善Abhishek的答案:
Class<?> cls = ClassB.class;
ClassB obj = (ClassB) cls.newInstance();
obj.setA();
obj.setA();
obj.test();
注意:这会创建ClassB类型的obj。如果你只需要Object类型,你可以每次都将它转换为ClassB类型:
Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
((ClassB) obj).setA();
((ClassA) obj).setA();
((ClassB) obj).test();
如果您想在评论中提出这个问题,如果您只知道cls,则可以进行类型转换:
Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).setA();
ClassB.class.cast(obj).test();
答案 3 :(得分:0)
Object是所有类的基类,但在这种情况下,它不知道setA()方法和test()方法。你可以这样做。
If(merge(i).MessageNumber = merge1(j).MessageNumber1) Then
Console.WriteLine("all fileds matched")
答案 4 :(得分:0)
class ClassA {
private int a;
public void setA() {
a = 15;
System.out.println(a);
}
}
class ClassB extends ClassA {
public static void main( String[] args ) throws IllegalAccessException, InstantiationException {
Class cls = ClassB.class;
ClassB obj = (ClassB) cls.newInstance();
obj.setA(); //Accessible
obj.test(); // Accessible
}
public void test() {
setA();
}
}
应该是这样的。
您想通过它的名称实例化一个类吗?
首先,您需要创建一个Class对象:
Class cls = Class.forName(strClassName); 然后实例化它(注意,这可以抛出各种异常 - 访问冲突,ClassNotFound,没有参数的公共构造函数等。)
Object instance = cls.newInstance();
然后你可以施展它:
return(SomeClass)实例; 请确保您了解以下各项之间的区别:
班级名称(大约是文件名) 类对象(本质上是类型信息) 类实例(此类型的实际对象) 如果需要,您还可以将cls对象强制转换为Class类型。但是,它并没有给你带来太多帮助。你可以将它内联到:
return(SomeClass)(Class.forName(strClassName).newInstance()); 哦,但你可以在实例化之前用cls对象进行类型检查。所以你只需要实现它,如果它满足你的API(实现你想要的接口)。
编辑:向反思添加更多示例代码。
例如:
if (cls.isInstance(request)) {
// ...
}