日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

發(fā)布時(shí)間:2024/7/23 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

From:Java中泛型 Class<T>、T?與?Class<?>、 Object類?Class類object.getClass()Object.class

? ? ? ? :https://www.cnblogs.com/zhaoyanhaoBlog/p/9362267.html

Class<T>和 Class<?>類型 有什么區(qū)別:https://www.jianshu.com/p/fecafcc83fba

?

?

Java中泛型

?

Java中泛型 Class<T>、T?與?Class<?>、 Object類?Class類object.getClass()Object.class

?

?

一. 區(qū)別

?

  • 單獨(dú)的 T? 代表一個(gè)類型(表現(xiàn)形式是一個(gè)類名而已)
  • Class<T>? 代表這個(gè)類型所對(duì)應(yīng)的類(又可以稱做類實(shí)例、類類型、字節(jié)碼文件)
  • Class<?>? 表示類型不確定的類
Class<T> 表示 T類型 的 字節(jié)碼文件,意思是:Class<T> 相當(dāng)于Class<T> c=T.class,T? t? new T() ;? 或者 Class<T> c= t.getClass();?通過(guò)以上可以獲取類名為 c.getName();

解釋:Class<T> ct=T.class,T? t? new T() ; 與 Class c=T.class,T? t? new T() ;?

ct 泛型指的是 ct 只能是 T 的字節(jié)碼,而 c 可以是任何類的字節(jié)碼。所以用 ct 用法更好

平時(shí)看 java源代碼的時(shí)候,如果碰到了泛型,像??、T 、K 、V、 E?這些是經(jīng)常出現(xiàn)的,但是不知道代表什么意思,今天特地整理下:

E --- Element (在集合中使用,因?yàn)榧现写娣诺氖窃?T --- Type(表示 Java 類型)K V --- 分別代表 java 鍵值中的 Key Value。N --- Number(數(shù)值類型)? --- 表示 不確定的 Java類型

舉例說(shuō)明:

Set<T> 表示 集合里 是 T類的實(shí)例 List<E> 表示 集合里 是 E類的實(shí)例 List<?> 表示 集合里的對(duì)象類型不確定,未指定 List 同 List<?> 是一樣的。

泛型的作用:?

1、用泛型:?List<T> list = new ArrayList<T>(); ?T t=list.get(0); ?2、不用泛型:?List ?list = new ArrayList(); ?T t = (T)list.get(0);?

?

?

二、如何創(chuàng)建一個(gè) Class<T> 類型實(shí)例

?

????? 就像使用非泛型代碼一樣,有兩種方式:

  • 調(diào)用方法?Class.forName()?
  • 或者使用類常量 X.class。

Class.forName()?被定義為返 回?Class<?>。另一方面,類常量?X.class?被定義為具有類型?Class<X>,所 以?String.class?是 Class<String>?類型的。

?

?

三、方法中為什么需要 <T> T 修飾呢

?

泛型的聲明,必須在方法的修飾符(public,static,final,abstract等)之后,返回值聲明之前。

public static <T> T request2Bean(HttpServletRequest request,Class<T> clazz){}

其中第一個(gè) <T> 是與傳入的參數(shù) Class<T> 相對(duì)應(yīng)的,相當(dāng)于返回值的一個(gè)泛型,后面的 T 是返回值類型,代表方法必須返回T類型的(由傳入的 Class<T> 決定)

?

?

四、Object類 Class類

?

Object類Class類 沒有直接的關(guān)系。

  • Object類 是一切 Java類的父類,對(duì)于普通的 java類,即便不聲明,也是默認(rèn)繼承了 Object 類。典型的,可以使用 Object 類中的toString()方法。
  • Class類 是用于 Java反射機(jī)制的一切 java類,都有一個(gè)對(duì)應(yīng)的 Class對(duì)象,他是一個(gè)final類。Class 類的實(shí)例表示,正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。?

平時(shí)看代碼時(shí),總是碰到這些即熟悉又陌生的名字,每天都與他們相見,但見面后又似曾沒有任何的交集,所以今天我就來(lái)認(rèn)識(shí)下這兩個(gè)江湖俠客的背景:

?

Object 泛型?通配符 區(qū)別?

Object 是所有類的根類,是具體的一個(gè)類,使用的時(shí)候可能需要類型強(qiáng)制轉(zhuǎn)換的,但是用通配符 ?、T 、K 、V、 E 等這些的話,在實(shí)際用之前類型就已經(jīng)確定了,不需要強(qiáng)制轉(zhuǎn)換。

  • 也就是說(shuō),如果一個(gè)方法能知道返回的是哪種類型(父類),就用 T,如果完全不知道的就用 ? 。。。用 T 得到的對(duì)象就不需要類型轉(zhuǎn)換了,而用 ? 的就必需用強(qiáng)轉(zhuǎn)了。

  • 第一種是固定的一種泛型,第二種是只要是Object類的子類都可以,換言之,任何類都可以,因?yàn)镺bject是>所有類的根基類,固定的泛型指類型是固定的,比如:Interge, String?就是?<T extends Collection>

<? extends Collection> 這里 ??代表一個(gè)未知的類型,但是,這個(gè)未知的類型實(shí)際上是?Collection?的一個(gè)子類,Collection?是這個(gè)通配符的上限。

舉個(gè)例子:class Test <T extends Collection> { }

  • <T extends Collection>?中限定了構(gòu)造此類實(shí)例的時(shí)候,T 是一個(gè)確定類型(具體類型),這個(gè)類型實(shí)現(xiàn)了Collection接口,但是實(shí)現(xiàn) Collection?接口的類很多很多,如果針對(duì)每一種都要寫出具體的子類類型,那也太麻煩了,干脆還不如用 Object 通用一下。
  • <? extends Collection> 中的 ? 表示是一個(gè)未知類型,是一個(gè)通配符泛型,這個(gè)類型是實(shí)現(xiàn) Collection 接口即可。

************************ 上面講的是什么鬼,當(dāng)你知道引入通配符泛型的由來(lái)之后?************************

當(dāng)引入泛型之后,遇到這種情況,參數(shù)怎么寫都不適合,總有2個(gè)方法不適用,為了給泛型類寫一個(gè)通用的方法,這時(shí)候就需要引入了 ?通配符的概念。

示例代碼:

public class Demo<T extends Animal> {private T ob;public T getOb() {return ob;}public void setOb(T ob) {this.ob = ob;}public Demo(T ob) {super();this.ob = ob;}public void print() {System.out.println("T的類型是:" + ob.getClass().getName());} }

?

CLASS

??? 在Java中,每個(gè) class 都有一個(gè)相應(yīng)的 Class 對(duì)象也就是說(shuō),當(dāng)我們編寫一個(gè)類,編譯完成后,在生成的.class文件中,就會(huì)產(chǎn)生一個(gè) Class 對(duì)象,用于表示這個(gè)類的類型信息

?

獲取 Class 實(shí)例的三種方式:

  • (1) :利用 對(duì)象調(diào)用 getClass()方法 獲取該對(duì)象的Class實(shí)例
  • (2) :使用 Class類的靜態(tài)方法 forName(),用類的名字獲取一個(gè)Class實(shí)例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
  • (3) :運(yùn)用 .class 的方式來(lái)獲取 Class 實(shí)例,對(duì)于基本數(shù)據(jù)類型的封裝類,還可以采用 .TYPE 來(lái)獲取相對(duì)應(yīng)的基本數(shù)據(jù)類型的Class實(shí)例

? ? ? ? 在 newInstance() 調(diào)用類中缺省的構(gòu)造方法 ObjectnewInstance()(可在不知該類的名字的時(shí)候,創(chuàng)建這個(gè)類的實(shí)例) Creates a new instance of the class represented by this Classobject.

? ? ? ? 在運(yùn)行期間,如果要產(chǎn)生某個(gè)類的對(duì)象,Java虛擬機(jī)(JVM)會(huì)檢查該類型的Class對(duì)象是否已被加載。如果沒有被加載,JVM會(huì)根據(jù)類的名稱找到 .class 文件并加載它。一旦某個(gè)類型的Class對(duì)象已被加載到內(nèi)存,就可以用它來(lái)產(chǎn)生該類型的所有對(duì)象

??

? Class對(duì)象的生成方式如下:

??? 1. Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名)。
??? 2. 類名.class? (?Object.class )。
??? 3. 實(shí)例對(duì)象.getClass() (object.getClass()?)。

?

?

五、Object.class 和?instanceObj.getClass()?的區(qū)別

?

兩者的區(qū)別如下:?

  • 類名.class 叫做 "類字面量",因 class 是關(guān)鍵字, 所以?類名.class 編譯時(shí)確定。
  • getclass() 是某個(gè)具體的方法來(lái)調(diào)用,是運(yùn)行時(shí)根據(jù)實(shí)際實(shí)例確定,getClass()是動(dòng)態(tài)而且是 final 的。?

例如:?

  • String.class 是能對(duì)類名的引用取得在內(nèi)存中該類型class對(duì)象的引用,
  • 而 new String().getClass() 是通過(guò)實(shí)例對(duì)象取得在內(nèi)存中該實(shí)際類型class對(duì)象的引用。?

?

?

六、示例代碼

?

示例 1

?ReflectClass.java

package com.android.peter.reflectdemo;import android.content.Context; import android.os.IBinder; import android.util.Log;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** Created by peter on 2018/8/22.*/public class ReflectClass {private final static String TAG = "peter.log.ReflectClass";// 創(chuàng)建對(duì)象public static void reflectNewInstance() {try {Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");Object objectBook = classBook.newInstance();Book book = (Book) objectBook;book.setName("Android進(jìn)階之光");book.setAuthor("劉望舒");Log.d(TAG,"reflectNewInstance book = " + book.toString());} catch (Exception ex) {ex.printStackTrace();}}// 反射私有的構(gòu)造方法public static void reflectPrivateConstructor() {try {Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");Constructor<?> declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);declaredConstructorBook.setAccessible(true);Object objectBook = declaredConstructorBook.newInstance("Android開發(fā)藝術(shù)探索","任玉剛");Book book = (Book) objectBook;Log.d(TAG,"reflectPrivateConstructor book = " + book.toString());} catch (Exception ex) {ex.printStackTrace();}}// 反射私有屬性public static void reflectPrivateField() {try {Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");Object objectBook = classBook.newInstance();Field fieldTag = classBook.getDeclaredField("TAG");fieldTag.setAccessible(true);String tag = (String) fieldTag.get(objectBook);Log.d(TAG,"reflectPrivateField tag = " + tag);} catch (Exception ex) {ex.printStackTrace();}}// 反射私有方法public static void reflectPrivateMethod() {try {Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");Method methodBook = classBook.getDeclaredMethod("declaredMethod",int.class);methodBook.setAccessible(true);Object objectBook = classBook.newInstance();String string = (String) methodBook.invoke(objectBook,0);Log.d(TAG,"reflectPrivateMethod string = " + string);} catch (Exception ex) {ex.printStackTrace();}}// 獲得系統(tǒng)Zenmode值public static int getZenMode() {int zenMode = -1;try {Class<?> cServiceManager = Class.forName("android.os.ServiceManager");Method mGetService = cServiceManager.getMethod("getService", String.class);Object oNotificationManagerService = mGetService.invoke(null, Context.NOTIFICATION_SERVICE);Class<?> cINotificationManagerStub = Class.forName("android.app.INotificationManager$Stub");Method mAsInterface = cINotificationManagerStub.getMethod("asInterface",IBinder.class);Object oINotificationManager = mAsInterface.invoke(null,oNotificationManagerService);Method mGetZenMode = cINotificationManagerStub.getMethod("getZenMode");zenMode = (int) mGetZenMode.invoke(oINotificationManager);} catch (Exception ex) {ex.printStackTrace();}return zenMode;}// 關(guān)閉手機(jī)public static void shutDown() {try {Class<?> cServiceManager = Class.forName("android.os.ServiceManager");Method mGetService = cServiceManager.getMethod("getService",String.class);Object oPowerManagerService = mGetService.invoke(null,Context.POWER_SERVICE);Class<?> cIPowerManagerStub = Class.forName("android.os.IPowerManager$Stub");Method mShutdown = cIPowerManagerStub.getMethod("shutdown",boolean.class,String.class,boolean.class);Method mAsInterface = cIPowerManagerStub.getMethod("asInterface",IBinder.class);Object oIPowerManager = mAsInterface.invoke(null,oPowerManagerService);mShutdown.invoke(oIPowerManager,true,null,true);} catch (Exception ex) {ex.printStackTrace();}}public static void shutdownOrReboot(final boolean shutdown, final boolean confirm) {try {Class<?> ServiceManager = Class.forName("android.os.ServiceManager");// 獲得ServiceManager的getService方法Method getService = ServiceManager.getMethod("getService", java.lang.String.class);// 調(diào)用getService獲取RemoteServiceObject oRemoteService = getService.invoke(null, Context.POWER_SERVICE);// 獲得IPowerManager.Stub類Class<?> cStub = Class.forName("android.os.IPowerManager$Stub");// 獲得asInterface方法Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);// 調(diào)用asInterface方法獲取IPowerManager對(duì)象Object oIPowerManager = asInterface.invoke(null, oRemoteService);if (shutdown) {// 獲得shutdown()方法Method shutdownMethod = oIPowerManager.getClass().getMethod("shutdown", boolean.class, String.class, boolean.class);// 調(diào)用shutdown()方法shutdownMethod.invoke(oIPowerManager, confirm, null, false);} else {// 獲得reboot()方法Method rebootMethod = oIPowerManager.getClass().getMethod("reboot",boolean.class, String.class, boolean.class);// 調(diào)用reboot()方法rebootMethod.invoke(oIPowerManager, confirm, null, false);}} catch (Exception e) {e.printStackTrace();}}}

MainActivity.java

package com.android.peter.reflectdemo;import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button;public class MainActivity extends AppCompatActivity {private final static String TAG = "peter.log.ReflectDemo";private Button mReboot;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mReboot = findViewById(R.id.btn_shutdown);mReboot.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 由于權(quán)限限制,并未生效ReflectClass.shutDown();ReflectClass.shutdownOrReboot(true,true);}});}@Overrideprotected void onResume() {super.onResume();try {// 創(chuàng)建對(duì)象ReflectClass.reflectNewInstance();// 反射私有的構(gòu)造方法ReflectClass.reflectPrivateConstructor();// 反射私有屬性ReflectClass.reflectPrivateField();// 反射私有方法ReflectClass.reflectPrivateMethod();} catch (Exception ex) {ex.printStackTrace();}Log.d(TAG," zenmode = " + ReflectClass.getZenMode());}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);}@Overrideprotected void onPause() {super.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();} }

?

示例 2

public class MainActivity extends AppCompatActivity {private static final String TAG = "sakura";// Used to load the 'native-lib' library on application startup.static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = (TextView) findViewById(R.id.sample_text);tv.setText(stringWithJNI("sakura")); // Log.d(TAG, stringFromJNI()); // Log.d(TAG, stringWithJNI("sakura"));try {testClass();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}public void testClass() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {Test sakuraTest = new Test();// 獲得Class的方法(三種)Class testClazz = MainActivity.class.getClassLoader().loadClass("myapplication.example.com.ndk_demo.Test");Class testClazz2 = Class.forName("myapplication.example.com.ndk_demo.Test");Class testClazz3 = Test.class;Log.i(TAG, "Classloader.loadClass->" + testClazz);Log.i(TAG, "Classloader.loadClass->" + testClazz2);Log.i(TAG, "Classloader.loadClass->" + testClazz3.getName());// 獲得類中屬性相關(guān)的方法Field publicStaticField = testClazz3.getDeclaredField("publicStaticField");Log.i(TAG, "testClazz3.getDeclaredField->" + publicStaticField);Field publicField = testClazz3.getDeclaredField("publicField");Log.i(TAG, "testClazz3.getDeclaredField->" + publicField);//對(duì)于Field的get方法,如果是static,則傳入null即可;如果不是,則需要傳入一個(gè)類的實(shí)例String valueStaticPublic = (String) publicStaticField.get(null);Log.i(TAG, "publicStaticField.get->" + valueStaticPublic);String valuePublic = (String) publicField.get(sakuraTest);Log.i(TAG, "publicField.get->" + valuePublic);//對(duì)于private屬性,需要設(shè)置AccessibleField privateStaticField = testClazz3.getDeclaredField("privateStaticField");privateStaticField.setAccessible(true);String valuePrivte = (String) privateStaticField.get(null);Log.i(TAG, "modified before privateStaticField.get->" + valuePrivte);privateStaticField.set(null, "modified");valuePrivte = (String) privateStaticField.get(null);Log.i(TAG, "modified after privateStaticField.get->" + valuePrivte);Field[] fields = testClazz3.getDeclaredFields();for (Field i : fields) {Log.i(TAG, "testClazz3.getDeclaredFields->" + i);}// 獲得類中method相關(guān)的方法Method publicStaticMethod = testClazz3.getDeclaredMethod("publicStaticFunc");Log.i(TAG, "testClazz3.getDeclaredMethod->" + publicStaticMethod);publicStaticMethod.invoke(null);Method publicMethod = testClazz3.getDeclaredMethod("publicFunc", java.lang.String.class);Log.i(TAG, "testClazz3.getDeclaredMethod->" + publicMethod);publicMethod.invoke(sakuraTest, " sakura");}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI();public native String stringWithJNI(String context); } ... public class Test {private static final String TAG = "sakura_test";public static String publicStaticField = "i am a publicStaticField";public String publicField = "i am a publicField";private static String privateStaticField = "i am a privateStaticField";private String privateField = "i am a privateField";public static void publicStaticFunc() {Log.d(TAG, "I`m from publicStaticFunc");}public void publicFunc(String str) {Log.d(TAG, "I`m from publicFunc" + str);}private static void privateStaticFunc() {Log.i(TAG, "I`m from privateFunc");}private void privateFunc() {Log.i(TAG, "I`m from privateFunc");} } ... ... 12-26 23:57:11.784 17682-17682/myapplication.example.com.ndk_demo I/sakura: Classloader.loadClass->class myapplication.example.com.ndk_demo.Test 12-26 23:57:11.784 17682-17682/myapplication.example.com.ndk_demo I/sakura: Classloader.loadClass->class myapplication.example.com.ndk_demo.Test 12-26 23:57:11.784 17682-17682/myapplication.example.com.ndk_demo I/sakura: Classloader.loadClass->myapplication.example.com.ndk_demo.Test 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredField->public static java.lang.String myapplication.example.com.ndk_demo.Test.publicStaticField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredField->public java.lang.String myapplication.example.com.ndk_demo.Test.publicField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: publicStaticField.get->i am a publicStaticField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: publicField.get->i am a publicField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: modified before privateStaticField.get->i am a privateStaticField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: modified after privateStaticField.get->modified 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredFields->private java.lang.String myapplication.example.com.ndk_demo.Test.privateField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredFields->public java.lang.String myapplication.example.com.ndk_demo.Test.publicField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredFields->private static final java.lang.String myapplication.example.com.ndk_demo.Test.TAG 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredFields->private static java.lang.String myapplication.example.com.ndk_demo.Test.privateStaticField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredFields->public static java.lang.String myapplication.example.com.ndk_demo.Test.publicStaticField 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredMethod->public static void myapplication.example.com.ndk_demo.Test.publicStaticFunc() 12-26 23:57:11.785 17682-17682/myapplication.example.com.ndk_demo D/sakura_test: I`m from publicStaticFunc 12-26 23:57:11.786 17682-17682/myapplication.example.com.ndk_demo I/sakura: testClazz3.getDeclaredMethod->public void myapplication.example.com.ndk_demo.Test.publicFunc(java.lang.String) 12-26 23:57:11.786 17682-17682/myapplication.example.com.ndk_demo D/sakura_test: I`m from publicFunc sakura

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。