Java型別資訊與用反射機制編寫通用的Excel匯入匯出
Java類檔案編譯後,會在類中新增一個靜態屬性,這個屬性就是Class類的例項,用於描述型別資訊。描述類資訊的架構圖如:
Class物件提供了一組方法,讓我們可以方便獲取類的屬性,方法,構造方法等資訊,並且用Field,Method,Constructor類來描述,可以用這些類來分析型別資訊和執行型別資訊來進行一些動態操作,例如反射,動態代理,依賴注入/控制反轉等
Class類
Classl類的物件用來表示執行時的類或介面資訊,可以通過Class物件獲取類名,父類資訊,還可以通過Class類獲取該類的屬性,方法,構造方法等
1. 通過.class屬性
2. 通過getClass()方法
3. 通過forName()方法
package xls;
public class ClassTest {
public void print(String str){
System.out.println("Hello "+str);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
package xls;
public class ClassTestMain {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//通過.class 屬性
Class<ClassTest> clazz1 = ClassTest.class;
System.out.println("通過.class屬性: "+clazz1.getCanonicalName());
//通過getClass()方法
ClassTest classTest = new ClassTest();
Class<? extends ClassTest> clazz2 = classTest.getClass();
System.out.println ("通過getClass()方法: "+clazz2.getCanonicalName());
//通過forName(className)方法 className為完整名字
Class<?> clazz3 = Class.forName("xls.ClassTest");
System.out.println("通過forName()方法: "+clazz3.getCanonicalName());
//用三種方法獲取的Class物件例項化ClassTest
ClassTest classTest1 = clazz1.newInstance();
classTest1.print("classTest1");
ClassTest classTest2 = clazz2.newInstance();
classTest2.print("classTest2");
ClassTest classTest3 = (ClassTest) clazz3.newInstance();
classTest3.print("classTest3");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
執行結果:
獲取Constructor物件
有四種方式獲取構造方法的Constructor物件
1. getConstructor(Class,parameterTypes…)用於獲取指定引數型別的Constructor物件
但是不能獲取私有的構造方法的物件
2. getDeclaredConstructor(Class,paramerterTypes..) 用於獲取指定引數型別的Constructor物件
但是能獲取公有和私有的構造方法的Constructor物件
3. getConstructors()用於獲取所有公有構造方法描述物件,若沒有共有建構函式時返回長度為0的陣列
4. getDeclaredConstructors()用於獲取所有公有和被保護的構造方法描述物件
package xls;
import java.lang.reflect.Constructor;
public class ConstructorTest {
/**
* 建構函式發生過載時,下方的無參構造方法被註釋掉的話,則變成沒有無參構造方法,
* 當使用Constructor constructor1 = clazz1.getConstructor();就會報錯
* 因為這種情況並沒有無參構造方法
* 但是當沒有寫構造方法時,則會有一個預設的無參構造方法使用
* Constructor constructor1 = clazz1.getConstructor();則沒有問題
*/
public ConstructorTest(){}
public ConstructorTest(String name){}
public ConstructorTest(String name,int age){}
protected ConstructorTest(int age){}
private ConstructorTest(double salary){}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
package xls;
import java.lang.reflect.Constructor;
public class ConstructorTestMain {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
/**
* 1.getConstructor(Class...parameterTypes)用於獲取指定引數型別的Constructor物件
* 但是不能獲取私有的構造方法的物件
*
* 2.getDeclaredConstructor(Class...paramerterTypes) 用於獲取指定引數型別的Constructor物件
* 但是能獲取公有和私有的構造方法的Constructor物件
*/
Class clazz1 = ConstructorTest.class;//有三種方式獲取Class物件
//獲取無參構造方法,要注意有沒有無參構造方法
Constructor constructor1 = clazz1.getConstructor();
System.out.println(constructor1.toString());
//獲取指定引數型別的Constructor物件
Constructor constructor2= clazz1.getConstructor(String.class);
System.out.println(constructor2.toString());
Constructor constructor3= clazz1.getConstructor(String.class,int.class);
System.out.println(constructor3.toString());
//下方的程式碼會報錯,因為getConstructor()不能獲取私有屬性的
//Constructor constructor4= clazz1.getConstructor(int.class);
//System.out.println(constructor4.toString());
//Constructor constructor5= clazz1.getConstructor(double.class);
//System.out.println(constructor5.toString());
System.out.println("<===============2===============>");
//獲取指定型別的被保護的構造方法的物件
Constructor constructor6 = clazz1.getDeclaredConstructor(int.class);
System.out.println(constructor6.toString());
Constructor constructor7 = clazz1.getDeclaredConstructor(double.class);
System.out.println(constructor7.toString());
System.out.println("<===============3===============>");
/**
* 3.getConstructors()用於獲取所有公有構造方法描述物件,若沒有共有建構函式時返回長度為0的陣列
* 4.getDeclaredConstructors()用於獲取所有公有和被保護的構造方法描述物件
*/
Constructor[] constructor8 = clazz1.getConstructors();
for(Constructor c :constructor8){
System.out.println(c.toString());
}
System.out.println("<===============4===============>");
Constructor[] constructor9 = clazz1.getDeclaredConstructors();
for(Constructor c :constructor9){
System.out.println(c.toString());
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
執行結果:
獲取Method物件
Method的物件用於描述類的單個方法(不包構造方法),可以通過它來獲取方法的訪問許可權,引數型別,返回值的型別等資訊,還可以根據Method的物件來動態執行。
package xls;
public class MethodTest {
public void hello(){}
private void student(String name){}
public void teacher(String name){
System.out.println("Hello "+name);
}
public final void school(){}
}
package xls;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodMain {
public static void main(String[] args) throws ClassNotFoundException,
NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
/**
* 獲取Method的四種方法與獲取Constructor的四種方法相似,用法相似
* 1.getMthod(String name,Class...parameterTypes)用於獲取指定名稱和引數型別的公有方法的描述物件,
* ,不能用來獲取私有和被保護的物件
* 2.getDeclaredMethod(String name,Class...parameterTypes)作用和第一個相同,
* 但可以獲取來獲取非公有的方法描述物件
*/
Class<?> clazz = Class.forName("xls.MethodTest");
Method method1 = clazz.getMethod("hello", null);
Method method3 = clazz.getMethod("teacher", String.class);
// Method method2 = clazz.getMethod("student", String.class);
Method method4 = clazz.getMethod("school",
相關推薦
Java型別資訊與用反射機制編寫通用的Excel匯入匯出
Java類檔案編譯後,會在類中新增一個靜態屬性,這個屬性就是Class類的例項,用於描述型別資訊。描述類資訊的架構圖如:
Class物件提供了一組方法,讓我們可以方便獲取類的屬性,方法,構造方法等資訊,並且用Field,Method,Constructor類
Java型別資訊(Class物件)與反射機制
RRTI的概念以及Class物件作用
RTTI(Run-Time Type Identification)執行時型別識別,對於這個詞一直是 C++ 中的概念,至於Java中出現RTTI的說法則是源於《Thinking in Java》一書,其作用是在執行時識別一個物件的型別
Java型別資訊(Class物件)與反射機制-1
RRTI的概念以及Class物件作用
RTTI(Run-Time Type Identification)執行時型別識別,對於這個詞一直是 C++ 中的概念,至於Java中出現RTTI的說法則是源於《Thinking in Java》一書,其作用是在執行時識別一個物件的型別
深入理解Java型別資訊(Class物件)與反射機制
關聯文章:
本篇主要是深入對Java中的Class物件進行分析,這對後續深入理解反射技術非常重要,主要內容如下:
深入理解Class物件
RRTI的概念以及Class物件作用
認識Class物件之前,先來了解一個概念,RTTI(Run-Time
Java 型別資訊詳解和反射機制
> 本文部分摘自 On Java 8
## RTTI
RTTI(RunTime Type Information)執行時型別資訊,能夠在程式執行時發現和使用型別資訊,把我們從只能在編譯期知曉型別資訊並操作的侷限中解脫出來
傳統的多型機制正是 RTTI 的基本使用:假設有一個基類 Shape 和它
java反射機制編寫簡單萬能DAO類
由於在搭建編寫萬能DAO時,已經寫了大量的程式碼
在此只給出部分的測試原始碼
如有需要完整專案或者有任何建議聯絡973639421
package com.oman.bean;
public class Person {
private int id;
privat
Java進階之reflection(反射機制)——反射概念與基礎
反射機制是Java動態性之一,而說到動態性首先得了解動態語言。那麼何為動態語言?
一、動態語言
動態語言,是指程式在執行時可以改變其結構:新的函式可以引進,已有的函式可以被刪除等結構上的變化。比如常見的JavaScript就是動態語言,除此之外Rub
利用反射機制編寫校驗參數(對象及屬性)為空的情況
check 參數 lec reflect ram declare 異常 ase urn
2
3 import java.lang.reflect.Field;
4 import java.lang.reflect.InvocationTargetExcept
Java程序語言的後門-反射機制
異常 proxy row 構造 () 程序語言 lean class類 不可 在文章JAVA設計模式-動態代理(Proxy)示例及說明和JAVA設計模式-動態代理(Proxy)源碼分析都提到了反射這個概念。
// 通過反射機制,通知力宏做事情method.invoke(ob
Java高階程式設計開發之反射機制的應用
瞭解反射機制之前,我們要明確一點,java語言是面向物件程式設計的開發語言。所以,在java的世界中,萬物皆物件。
那麼這樣的話,我們在程式設計開發過程中,所建立的類是不是物件呢?是誰的物件呢?是哪個類的物件呢?
答案是肯定的。類也是物件,它是java.lang.Clas
Java程式語言的後門-反射機制
// 通過反射機制,通知力巨集做事情
method.invoke(object, args);
// 通過反射,將h作為引數,例項化代理類,返回代理類例項。
return cons.newInstance(new Object[]{h});
而且在
// 將介面類物件陣列clone一份。
f
執行時型別資訊(RTTI + 反射)
執行時型別資訊使得你可以在程式執行時發現和使用型別資訊。
Java是如何讓我們在執行時識別物件和類的資訊的,主要有3種方式
“傳統的”RTTI,它假定我們在編譯時已經知道了所有的型別,比如Shape s = (Shape)s1;
“反射”機制,它執行我們在執行時
利用java反射機制實現讀取excel表格中的資料
如果直接把excel表格中的資料匯入資料庫,首先應該將excel中的資料讀取出來。
為了實現程式碼重用,所以使用了Object,而最終的結果是要獲取一個list如List<User>、List<Book>等,所以需要使用泛型機制去實現。下面會給出程式
java記憶體管理與垃圾回收機制
看了很多java記憶體管理的文章或者部落格,寫的要麼籠統,要麼劃分的不正確,且很多文章都千篇一律。例如部分地方將jvm籠統的分為堆、棧、程式計數器,這麼分太過於籠統,無法清晰的闡述java的記憶體管理模型;部分地方將jvm分為堆、棧、程式計數器、常量池、
iOS開發—巧用反射機制
1、應用場景——自定義UITabBarController的TabBar檢視
(1)隱藏TabBar檢視
一般我們選擇自定義TabBar檢視有兩種方式。1是將tabBar檢視隱藏;2是將Tab
利用java的反射機制實現通用dao
java的反射機制前面已經講過,這裡不再贅述,這篇文章將會利用反射,來實現一個通用的dao層。
1 一般情況下的dao層
我們先來看一下,通常,我們是如何寫dao的。
public class Person {
public int p
Java 從入門到精通-反射機制
導讀
Java反射機制是開發者邁向結構化開發的重要一步,同時掌握了反射機制也就掌握了所有框架的核心實現思想。
認識反射機制
簡單例子
通過以上的程式就會發現,除了物件的正向處理操作之外,還可以通過getClass()方法來獲取一個類對應的完整的資訊的結構,而這就是反射的開始。
Class類物件例項化
javaWeb(十四)頁面向伺服器傳送請求的四個方式、通過反射機制實現通用Servlet
之前我們是頁面傳一個請求過來,我們就寫一個servlet,很麻煩,這次用反射機制直接實現通用BaseServlet,然後我們自己建立根據請求建立的servlet只要繼承BaseServlet,然後我們只要在頁面請求裡寫上我們需要處理的方法(增刪改查),直接在這個servlet裡實現就行了
JAVA:Excel匯入匯出詳解(3)--匯出
Excel匯出
一、設定查詢條件
注意:無法通過Ajax下載
jsp程式碼 <form class="col-sm-2" action="/manage/order/download" method="post" onsubmit="checkForm()"
JAVA:Excel匯入匯出詳解(2)--匯入
1. 瀏覽資料夾,選擇需要上傳的檔案
程式碼
jsp
<li class="col-sm-1">
<span>上 &a