比如:class test{
test(){
abc s1=new abc();
}
public void main(String args[]){
test t1=new test();}
}class abc{
abc()
{如何获得实例名(s1)?}
}在abc类中,如何获得实例的名字,也就是s1?

解决方案 »

  1.   

    对象名属于源代码级的字符常量,是没法在运行中动态取得的.可以使用一个不太严谨的方法,给被实例化的类增加一个字段,用来记录当前生成的对象名,构造方法增加入参,在做new操作的时候人为的把当前对象的名称记录下来,再搞一个get方法取名称.这种方法不能绝对保证得到的对象名正确,全在于new的时候能否保证传入的确实是当前使用的对象名.
      

  2.   

    答:你这个abc s1是构造器test()中的局部变量,无论如何,在运行时都是找不到的.
    若是类或对象的成员,通过反射,可以找到.如下例:import java.lang.reflect.*;public class Test{
    abc s2;//这个可以找到
    public Test(){
      abc s1=new abc();//这个局部变量是找不到的
    }
    public static void main(String args[]){
    Test t1=new Test();
     }
    }class abc{
    abc()
    {
    Class c=Test.class;
    Field[] fs=c.getDeclaredFields();
    for(Field e:fs)
    {
    System.out.println("字段名:"+e.getName());
    }
    //如何获得实例名(s1)?}
    }
    }
    程序运行结果:
    字段名:s2
      

  3.   

    答:你这个abc s1是构造器test()中的局部变量,无论如何,在运行时都是找不到的.
    若是类或对象的成员,通过反射,可以找到.如下例:import java.lang.reflect.*;public class Test{
    abc s2;//这个可以找到
    public Test(){
      abc s1=new abc();//这个局部变量是找不到的
    }
    public static void main(String args[]){
    Test t1=new Test();
     }
    }class abc{
    abc()
    {
    Class c=Test.class;
    Field[] fs=c.getDeclaredFields();
    for(Field e:fs)
    {
    System.out.println("字段名:"+e.getName());
    }
    //如何获得实例名(s1)?}
    }
    }
    程序运行结果:
    字段名:s2
      

  4.   

    this是获得当前对象引用名称
    5楼不错
      

  5.   

    对个屁,胡说八道。
    s1对于abc而言根本谈不上局部变量还是什么。一个人生下来以后他可能被编入A组也可能被编入B组或两个组都有,不可能在生他的时候就知道他是A组还是B组。
    一个对象不可能知道它会被哪个变量引用,Object o1 = new Object();
    Object o2 = o2;
    现在两个变量同时指向那个对象,在那个对象实现时如何知道谁会引用它?
      

  6.   

    楼主要看清楚:访问权限(访问修饰符),变量的作用域
    s1对abc()方法可见吗?呵呵,以后注意
      

  7.   

    答:这个abc s1是构造器test()中的局部变量,难道不对吗?倒要听听你的所谓的"高见".
      

  8.   

    答:s1对abc()构造器不可见,照样能找到数据成员的变量名,有何不可?import java.lang.reflect.*;public class Test{
    private abc s2;//这个可以找到
    public Test(){
      abc s1=new abc();//这个局部变量是找不到的
    }
    public static void main(String args[]){
    Test t1=new Test();
     }
    }class abc{
    abc()
    {
    Class c=Test.class;
    Field[] fs=c.getDeclaredFields();
    for(Field e:fs)
    {
    System.out.println("字段名:"+e.getName());
    }
    }
    }看清楚:private abc s2;//这个是private,对类abc当然不可见程序运行结果:
    字段名:s2
      

  9.   

    用this是得不到实例的名字的,5楼的办法可以得到s2的名字
    但是s1为什么找不到?反正是实例化abc类,不存在对abc可见不可见啊?
      

  10.   


    那就是说得不到s1是由reflect类所影响的吧?
    就是说如果有一个更强的类的话,是可以在实例化局部变量s1的时候得到s1的名字的?
      

  11.   

    答:那就是说得不到s1是由reflect类所影响的吧? 
    是的.从理论上说,如果编译程序将编译时符号表中的信息(如:所有的方法及其内部定义的局部变量名)都保留下来,主个符号表一直保留到程序运行时,且作为对象的某一方面的"信息",用指针指向它,我想:这时你的想法是可行的.只是目前编译程序没有一家是这样做的啊.(因为局部变量的名字在运行时已变成栈中的一个偏移量了(当然也有可能如:JAVA的混淆器改变了名字),似乎价值不大)
      

  12.   

    这么多眼睛长到什么地方了?睁大点看:class test{
    test(){
    abc s1=new abc();
    }
    public void main(String args[]){
    test t1=new test();}
    }class abc{
    abc()
    {如何获得实例名(s1)?}
    }
    abc s1 = new abc();
    s1是指向abc实例的变量名,而楼主要在abc的构造方法中知道是外部是哪个变量名指向自己。在类定义时不可能知道它的实例会被哪个变量引用,而且可能会有多个变量指向这个实例。只有在运行时JVM才知道
    哪些变量指向了某个实例。这和局部变量有什么屁关系?还有说反射的,反个屁,都是胡说八道。你反给我看看。变量本身在方法栈中只是一个地址,编译后就没有任何符号。即使JVM自己知道一个对象有哪些变量在指向它,但那是一个
    对象引用计数表,为了垃圾回收用的。其它都是引用某对象的句柄地址,它不可能知道程序员定义的s1指向这个对象
    还是s2指向这个对象。怎么可能从abc中获取到是什么名称的变量指向abc?胡说是因为无知。而无知的人总认为别人是无知的。
      

  13.   

    实例名?存在局部和全局之分么?这个不是相对的么?哪需要就传个参数过去获取应该就可以了吧。。不解ING