java反射泛型
A. java反射與泛型:Class<>和Class一樣嗎我感覺一樣
java5開始的泛型。Class<?>只是其中一種。
Vector<?> vec = new Vector<?>()
Vector<int> vec = new Vector<int>()
Vector vec1 = new Vector(); 這倆一樣不?
---------------------------------------------------------
而class<?>與class的不同之處就是,前者能拿到泛型的具體類型,而後者不能。
這往往是設計框架時使用的,極具靈活性。
平時一般用的很少。因為反射通常只會反射一個普通的類,所以也就沒啥區別了
B. Java通過反射出來的類如何作為泛型的類型
時隔四年後看到的。一般出現這種情況可以 寫一個用來統一類型的 介面;
例如:
public class TypeVre {
interface A {
}
class B implements A{}
class C implements A{}
public static void main(String[] args) {
List<A> ss =new ArrayList<A>();
TypeVre typeVre = new TypeVre();
B b = typeVre.new B();
C c = typeVre.new C();
ss.add(b);
ss.add(c);
int size = ss.size();
for (int i = 0; i < size; i++) {
System.out.println(ss.get(i));
}
}
}
C. java參數為泛型的方法怎麼反射
通過方法,取得真正的類型的Class,就可以運用了
- =(ParameterizedType)this.getClass().getGenericSuperclass();//獲取當前new對象的泛型的父類類型
- Classclazz=(Class<T>)parameterizedType.getActualTypeArguments()[0];
- System.out.println("clazz==>>"+clazz);
~
~
~
~
D. Java Web項目中反射工具類里關於泛型的使用
這是一個泛型方法,返回值是Class<T>類型的
看看這個http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html
返回值類型是Class類型
E. java課程分享Java的反射機制
Java反射機制是一個非常強大的功能,在很多大型項目比如Spring,Mybatis都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。下面java課程http://www.kmbdqn.com/就從實際應用的角度出發,來應用一下Java的反射機制。
反射基礎
p.s:本文需要讀者對反射機制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的QuickStart。
在應用反射機制之前,首先我們先來看一下如何獲取一個對象對應的反射類Class,在Java中我們有三種方法可以獲取一個對象的反射類。
通過getClass方法
在Java中,每一個Object都有一個getClass方法,通過getClass方法我們可以獲取到這個對象對應的反射類:
Strings="ziwenxie";
Class<?>c=s.getClass();
通過forName方法
我們也可以調用Class類的靜態方法forName:
Class<?>c=Class.forName("java.lang.String");
使用.class
或者我們也可以直接使用.class:
Class<?>c=String.class;
獲取類型信息
在文章開頭我們就提到反射的一大好處就是可以允許我們在運行期間獲取對象的類型信息,下面我們通過一個例子來具體看一下。
首先我們在typeinfo.interfacea包下面新建一個介面A:
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
接著我們在typeinfo.packageaccess包下面新建一個介面C,介面C繼承自介面A,並且我們還另外創建了幾個用於測試的方法,注意下面幾個方法的許可權都是不同的。
F. java 反射:怎麼取出類的泛型類
這是一個泛型方法,返回值是Class類型的看看這個返回值類型是Class類型
G. java反射:怎麼取出類的泛型類
T.getClass()或者T.class都是非法的,因為T是泛型變數。
由於一個類的類型是什麼是在編譯期處理的,故不能在運行時直接在Base里得到T的實際類型。
有一種變通的實現方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}
Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}
class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}