2014-12-31 4 views
0

Есть ли способ сделать ссылочную переменную именем класса?Ссылка на классы в Java

Например, предположим, что у нас есть эти два класса

class ClassA { 
    public static String s = "This is class A"; 
} 

class ClassB { 
    public static String s = "This is class B"; 
} 

, а затем мы хотим использовать их как этот

// first somehow give the name of ClassA to some variable MyRef 

// then print "This is class A" 
System.out.print(MyRef.s); 

// then give the name of ClassB to the same variable MyRef 

// and then print "This is class B" 
System.out.print(MyRef.s); 

Есть ли способ сделать это? Если нет, есть ли другой простой способ сделать то же самое, то есть легко переключаться между статическими переменными ClassA и статическими переменными ClassB?

+0

просто ClassA.s и ClassB.s – RahulArackal

+4

'ClassA.class.getName()' – manouti

+1

так что не так с ClassA.s ? – Lrrr

ответ

2

Ближе всего вы могли бы пройти ClassA.class или ClassB.class как Class, а затем использовать отражение, чтобы получить поле для этого класса и его значение.

// TODO: Much better exception handling :) (It's almost never appropriate to 
// throw Exception...) 
public static String getS(Class<?> clazz) throws Exception { 
    Field field = clazz.getField("s"); 
    return (String) field.get(null); 
} 

Вызов его:

String a = getS(ClassA.class); 
String b = getS(ClassB.class); 

Вообще говоря, лучшим решением было бы использовать наследование, но это требует экземпляра некоторого суперкласса или интерфейса, а затем метод вместо поля. Конечно, это может не соответствовать остальным вашим требованиям - у нас нет большой идеи о том, что вы пытаетесь сделать.

-1

Мне кажется, что вам нужна ссылка на class вашего объекта. При этом вы можете получить доступ к имени своего класса, просто используя метод class.getSimpleName().

Например:

ClassA a = new ClassA(); 
ClassB b = new ClassB(); 
System.out.println(b.getClass.getSimpleName()); 
System.out.println(b.getClass.getSimpleName()); 

Этот метод, в отличие от вашей, не требует, чтобы вручную обновить s поле, если вы когда-либо изменить имя класса после рефакторинга.

Для получения дополнительной информации об объекте класса увидеть это: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

+0

Вопрос о доступе к свойству класса. – BarrySW19

+0

Извините, но я не думаю, что ваш downvote справедлив. Это решение, похоже, соответствует сценарию использования, показанному в вопросе. –

1

Попробуйте использовать интерфейс, наоборот:

interface MyRef { 
    String getS(); 
} 

class ClassA implements MyRef { 
    public static String s = "This is class A"; 
    @Override 
    public String getS(){ 
     return s; 
    } 
} 

class ClassB implements MyRef { 
    public static String s = "This is class B"; 
    @Override 
    public String getS(){ 
     return s; 
    } 
} 

class Ideone{ 
    public static void main (String[] args){ 
     MyRef ref = new ClassA(); 
     System.out.println(ref.getS());//prints: This is class A 

     ref = new ClassB(); 
     System.out.println(ref.getS());//prints: This is class B 
    } 
} 
+0

Здесь [demo] (http://ideone.com/tRHRpI) – Arvind

0

это то, что вы ищете?

public class MyRef { 
    private Class<?> klass; 
    public MyRef() { 
    } 
    public void setRef(Class<?> klass){ 
     this.klass = klass; 
    } 
    @Override 
    public String toString() { 
     return "This is " + klass.getName(); 
    } 

    public static void main(String[] args) { 
     class Test1{} 
     class Test2{} 

     MyRef mr = new MyRef(); 

     Test1 t = new Test1();  
     mr.setRef(t.getClass()); 
     System.out.println(mr); 

     mr.setRef(Test2.class); 
     System.out.println(mr); 

    } 

}

Это печатает:

This is MyRef$1Test1 
This is MyRef$1Test2