锁定老帖子 主题:是谁调用了它的静态方法?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-14
如果我的类是
class ABC<String>{ public void someMethod(){ } } 那么是可以的 |
|
返回顶楼 | |
发表时间:2007-12-14
velna_007 写道 不知道你有没有试过,这个行不通。。。 如果我的类是 class ABC<String>{ public void someMethod(){ } } 那么是可以的 我已经给你那个提示了,如果你觉得不可行,你通过站内信息给我,不要在这个帖子后跟贴 因为,你最后的跟贴和主贴主题不相关,而且还跟两个贴。 煞风景 |
|
返回顶楼 | |
发表时间:2007-12-14
子类overwrite父类的静态方法。
public class User extends ActiveRecord { public static int count() { RuntimeException e = new RuntimeException(); System.out.println(e.getStackTrace()[0].getClassName()); return ActiveRecord.count(); } } |
|
返回顶楼 | |
发表时间:2007-12-14
|
|
返回顶楼 | |
发表时间:2007-12-14
Qieqie 写道 velna_007 写道 我昨天也触及了一个有点类似的问题,比如一个模板类
class ABC<E>{ public void someMethod(){ } } 我想在someMethod里知道E到底是什么类,想了很久,好像也是无解 这个有解 给你参考:http://www.hibernate.org/328.html public abstract class GenericHibernateDAO<T, ID extends Serializable> implements GenericDAO<T, ID> { private Class<T> persistentClass; private Session session; public GenericHibernateDAO() { this.persistentClass = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } } 这个要继承.不继承的话还真的没有办法. 同主题相关的一点东西 具体的可以看 JLS 第三版 15.12.3 15.12.4 public class M { static void test() { System.out.println("---"); } public static void main(String[] args) { ((M) null).test(); } } |
|
返回顶楼 | |
发表时间:2007-12-16
晕,谁说无解,答案简单的很啊。你在ActiveRecord里面用
this.getClass()不就完了? User调用count的话,虽然方法定义在父类,但是this指向的就是User public abstract class ActiveRecord { public static int count() { //我应该如何知道,Xxx.count()中的Xxx实际是什么类? //假如java在此可以使用关键字class,用以表示实际调用该静态方法的类: Class targetClass = this.getClass(); String hql = "select count(*) from " + targetClass.getSimpleName() + " where " + propertyName + "=?"; List list = theStaticHibernateTemplate.find(hql, value); return (Integer) list.get(0); } } |
|
返回顶楼 | |
发表时间:2007-12-16
leadyu 写道 晕,谁说无解,答案简单的很啊。你在ActiveRecord里面用
this.getClass()不就完了? User调用count的话,虽然方法定义在父类,但是this指向的就是User public abstract class ActiveRecord { public static int count() { //我应该如何知道,Xxx.count()中的Xxx实际是什么类? //假如java在此可以使用关键字class,用以表示实际调用该静态方法的类: Class targetClass = this.getClass(); String hql = "select count(*) from " + targetClass.getSimpleName() + " where " + propertyName + "=?"; List list = theStaticHibernateTemplate.find(hql, value); return (Integer) list.get(0); } } 你传染我,让我晕了 |
|
返回顶楼 | |
发表时间:2007-12-17
呵呵,你说的没错,在javaeye上我确实是一个刚出来混的。看看,兄台都已经5颗星拉,难怪看不起俺们刚出来混的。
还有,兄弟不要轻易质疑俺们这种刚出来混得,积分高低实在不说明什么问题呀,在我搞自己的Jwebap项目之前,确实很少来Javaeye,是我的错。你可以执行执行下面这段,看看: public abstract class AA { public void count(){ System.out.println(this.getClass()); } } public class BB extends AA{ public static void main(String[] a){ BB b=new BB(); b.count(); } } 多的就不说了,就算你抓住了别人的小辫子,也不用出言不逊巴。 |
|
返回顶楼 | |
发表时间:2007-12-17
楼上兄弟,没弄清楚楼主的需求!static
|
|
返回顶楼 | |
发表时间:2007-12-17
抱歉,是我没看到static。找了找资料,纯当初学,总结一下。
如果是static那就不可能在方法内部知道调用者的信息的,根本没有所谓的调用者。 方法定义在类级别,方法本身不会实例化,在虚拟机内部调用也不会引用到一个Runtime对象。 也就是说User.count和ActiveRecord.count是一样的。可以看看VM Spec.的说明: 规范给出了2个例子说明这个问题: int addTwo(int i, int j) { return i + j; } static int addTwoStatic(int i, int j) { return i + j; } 分别编译出来的指令如下: 0 aload_0 // Push local variable 0 (this) 1 bipush 12 // Push int constant 12 3 bipush 13 // Push int constant 13 5 invokevirtual #4 // Method Example.addtwo(II)I 8 ireturn 0 bipush 12 2 bipush 13 4 invokestatic #3 // Method Example.addTwoStatic(II)I 7 ireturn 可以看出,虚拟机内部是通过2种指令来执行实例化方法和静态方法的。 对于invokevirtual #4指令,可以看出,必须先调用aload_0对this进行压栈,参数查找从局部变量栈中的第一位开始。至于#4,代表的是一个常量符号,编译时由编译器临时生成存放在class文件内,在对象实例化时动态付值为方法的地址偏移量。(这是由于编译器无法在编译期知道方法内存的分配地址) 对于invokestatic #3指令可以看出,他的参数寻找是从局部变量的第0位开始,并不存在什么调用者,也不存在实例化方法。 这就可以解释为什么静态方法里面不存在this,以及为什么User.count显示的线程调用栈还是ActiveRecord.count,这是由于调用根本不是由User实例或者对象发起。 只是完全不明白这里为什么要设计成静态方法。 至于LZ之前说的,class文件内部仍然保持着User.count的语义,何以见得?除非你找到常量池里面定义的#3,指向,也许这个常量根本就不再编译期指向。 |
|
返回顶楼 | |