关于class的签名Signature

 

 

 

 

举例1:

public class Test05<A,
                    B extends java.util.List<String>,
                    C extends InputStream&Serializable> {
	public <AA extends A,BB extends B,CC extends BB> void test1(
							AA a,
							List<BB> b,
							List<? extends CC> c
	){
		
	}

	public void test(){
		List<? extends Number> a = new ArrayList<Integer>();
		List<? super Integer> b = new ArrayList<Number>();
		List<?> c = new ArrayList<String>();
	}
	
}

类的签名如下:

<
	A:Ljava/lang/Object;
	B::Ljava/util/List<Ljava/lang/String;>;
	C:Ljava/io/InputStream;:Ljava/io/Serializable;
>
Ljava/lang/Object;

其中的Ljava/lang/Object;表示这个类的父类。而B extends java.util.List<String>被描述为B::Ljava/util/List<Ljva/lang/String;>;因为List是接口类型,而ClassBound为空就会出现这样的情况。

方法的签名如下:

<AA:TA;BB:TB;CC:TBB;>
(TAA;Ljava/util/List<TBB;>;Ljava/util/List<+TCC;>;)
V

 

举例2:

class pc<T>{}

interface ifc1<T>{}

interface ifc2<T>{}

public class Test05<T> 
		extends pc<List<? extends String>> 
		implements ifc1<String>,ifc2<List<? extends Number>> {
	
	
	List<? extends Number> a = new ArrayList<Integer>();
	List<? super Integer> b = new ArrayList<Number>();
	List<?> c = new ArrayList<String>();
	
}

类的签名如下:

<T:Ljava/lang/Object;>
Lcom/test19/pc<Ljava/util/List<+Ljava/lang/String;>;>;
Lcom/test19/ifc1<Ljava/lang/String;>;
Lcom/test19/ifc2<Ljava/util/List<+Ljava/lang/Number;>;>;

三个字段的签名如下:

Ljava/util/List<+Ljava/lang/Number;>;
Ljava/util/List<-Ljava/lang/Integer;>;	
Ljava/util/List<*>;

  

  

class TestClassSig<T> extends Parent<Integer>{	
	class BB<B extends T>{
		
	}
}

则字段签名为:

 com.test19.TestClassSig$BB(com.test19.TestClassSig);
    descriptor: (Lcom/test19/TestClassSig;)V
    flags:
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: putfield      #10                 // Field this$0:Lcom/test19/TestClassSig;
         5: aload_0
         6: invokespecial #12                 // Method java/lang/Object."<init>":()V
         9: return
      LineNumberTable:
        line 19: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lcom/test19/TestClassSig$BB;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            0      10     0  this   Lcom/test19/TestClassSig<TT;>.BB<TB;>;

可以看到LocalVariableTypeTable的Signature的签名为:Lcom/test19/TestClassSig<TT;>.BB<TB;>;  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

转载于:https://www.cnblogs.com/extjs4/p/9431303.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值