Java反射機制及其獲取InputStream的兩種方式
圖一:
java.lang.Class:是反射的源頭。
我們建立了一個類,通過編譯(javac.exe),生成對應的.class檔案。之後我們使用java.exe載入(JVM的類載入器完成的)
此.class檔案,此.class檔案載入到記憶體以後,就是一個執行時類,存在在快取區。那麼這個執行時類本身就是一個Class的例項!
1.每一個執行時類只加載一次!
2.有了Class的例項以後,我們才可以進行如下的操作:
1)*建立對應的執行時類的物件
2)獲取對應的執行時類的完整結構(屬性、方法、構造器、內部類、父類、所在的包、異常、註解、...)
3)*呼叫對應的執行時類的指定的結構(屬性、方法、構造器)
4)反射的應用:動態代理
示例程式碼:
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
import org.junit.Test;
public class TestReflection {
/*
* 有了反射,可以通過反射建立一個類的物件,並呼叫其中的結構
*/
@Test
public void test1() throws Exception {
Class clz = Person.class;
//1.建立clz對應的執行時類Person類的物件
Person p = (Person) clz.newInstance();
System.out.println(p);
//2.通過反射呼叫執行時類的指定屬性
Field f1 = clz.getField("name");
f1.set(p, "小明");
System.out.println(p);
Field f2 = clz.getDeclaredField("age");//獲取宣告的屬性
f2.setAccessible(true);//可見性設定為可見
f2.set(p, 23);
System.out.println(p);
//3.通過反射呼叫執行時類的指定的方法
Method m1 = clz.getMethod("show");
m1.invoke(p);
Method m2 = clz.getMethod("display", String.class);
m2.invoke(p, "CHN");
}
/*
* 獲取Class例項的3種方式
*/
@Test
public void testGetClass() throws ClassNotFoundException {
//1.呼叫執行時類本身的.class屬性
Class clz1 = Person.class;
System.out.println(clz1.getName());
Class clz2 = String.class;
System.out.println(clz2.getName());
//2.通過執行時類的物件獲取
Person p = new Person();
Class clz3= p.getClass();
System.out.println(clz3.getName());
//3.通過Class的靜態方法獲取(通過此方法,體會一下反射的動態性)
String className = "com.iting.testJava.main.Person";
Class clz4 = Class.forName(className);
System.out.println(clz4.getName());
//4.(瞭解)通過類的載入器
ClassLoader classLoader = this.getClass().getClassLoader();
Class clz5 = classLoader.loadClass(className);
System.out.println(clz5.getName());
}
/*
* 關於類的載入器:ClassLoader
*/
@Test
public void testClassLoader() throws Exception {
ClassLoader loader1 = ClassLoader.getSystemClassLoader();
//System ClassLoader可直接獲取
System.out.println(loader1);// [email protected]
ClassLoader loader2 = loader1.getParent();
//Extension ClassLoader可直接獲取
System.out.println(loader2);//[email protected]
ClassLoader loader3 = loader2.getParent();
//Bootstrap ClassLoader無法直接獲取
System.out.println(loader3);//null
//自定義類存放在System ClassLoader
Class clz1 = Person.class;
ClassLoader loader4 = clz1.getClassLoader();
System.out.println(loader4);// [email protected]
//核心類庫由Bootstrap ClassLoader載入
String className = "java.lang.String";
Class clz2 = Class.forName(className);
ClassLoader loader5 = clz2.getClassLoader();
System.out.println(loader5);//null
/*
* 需掌握如下:
*/
ClassLoader loader = this.getClass().getClassLoader();//獲取自定類的載入器(System ClassLoader)
System.out.println(loader);//[email protected]
//方法一:放在包下
InputStream is = loader.getResourceAsStream("com\\iting\\testJava\\main\\jdbc.properties");
//方法二:放在工程下
//FileInputStream is = new FileInputStream("jdbc1.properties");
Properties pro = new Properties();
pro.load(is);
String user = pro.getProperty("user");
System.out.println(user);
String password = pro.getProperty("password");
System.out.println(password);
}
}
class Person {
public String name;
private int age;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("我是好人!");
}
public void display(String str) {
System.out.println("我的國籍是" + str);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
相關推薦
Java反射機制及其獲取InputStream的兩種方式
圖一: java.lang.Class:是反射的源頭。 我們建立了一個類,通過編譯(javac.exe),生成對應的.class檔案。之後我們使用java.exe載入(JVM的類載入器完成的) 此.class檔案,此.class檔案載入到記憶體以後
Java反射02 : Class物件獲取的三種方式和通過反射例項化物件的兩種方式
1.Class物件獲取的三種方式 上一章節已經說過,一般情況下,Java反射操作都需要首先獲取Class物件。獲取Class物件的方式有三種。 公有屬性class 方法getClass()
Java反射機制能夠獲取的信息,與應用
rri 代理 pan [] reflect 語言 子類 list tro 一、什麽是Java反射機制? 【1】反射機制是在運行狀態中,對於任何一個類,都能夠知道這個類的所有屬性和方法; 【2】對於任意一個對象,都能夠調用它的任意一個屬性和方法; 像這種動態獲取類的信
通過java反射機制,獲取物件的屬性和值(包括所有繼承的父類)
java的反射機制提供了兩種方法: getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到繼承的父類的屬性。 getFields():既能獲取本類的屬性也能得到父類的
通過java反射機制,獲取對象的屬性和值(包括所有繼承的父類)
原創 getc getname 因此 declared protect 版權 str 來源 java的反射機制提供了兩種方法: getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到
java實現多線程的兩種方式
vat nts lock name div print 創建對象 pre thread Java需要並發控制三個原因: 多線程環境 存在共享資源 多個線程操作(修改)共享資源 下面分別用繼承Thread類和實現Runnable接口倆種方式實現並發控制, 繼承Thread
Java中創建String的兩種方式差異
ima 分享 引用 永遠 bubuko 技術分享 方式 println print 我們知道創建一個String類型的變量一般有以下兩種方法: String str1 = "abcd"; String str2 = new String("abcd"); 那麽
java實現二分查詢演算法,兩種方式實現,非遞迴和遞迴
java實現二分查詢演算法 1、概念 2、前提 3、思想 4、過程 4、複雜度 5、實現方式 1. 非遞迴方式 2. 遞迴方式
java之執行緒建立的兩種方式,六種狀態和匿名內部類建立子類或實現類物件
一.匿名內部類建立子類或實現類物件 new Test(){} 相當於建立了Test類的子類物件 並且沒有類名 建立介面實現類 new 介面名() {};介面實現類的物件 注意 : new 後邊是類或者介面名 大括號內是類或者介面中的方法 public
java實現多執行緒的兩種方式
Java需要併發控制三個原因: 多執行緒環境 存在共享資源 多個執行緒操作(修改)共享資源 下面分別用繼承Thread類和實現Runnable介面倆種方式實現併發控制, 繼承Thread類 繼承Thread類方式,最後建立物件是因為會是三個不同的執行緒物件,所以
Java Spark之建立RDD的兩種方式和操作RDD
首先看看思維導圖,我的spark是1.6.1版本,jdk是1.7版本 spark是什麼? Spark是基於記憶體計算的大資料平行計算框架。Spark基於記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者將Spark 部署在大量廉
Java專案中使用groovy的兩種方式
可能還有更多的使用方式,在此只記錄自己使用的兩種方式: 方式一 String type = "List<String>"; String json
springboot通過java bean整合通用mapper的兩種方式
前言:公司開發的框架基於springboot深度封裝,只能使用java bean的方式進行專案配置。第一種:1.引入POM座標,需要同時引入通用mapper和jpa<dependency> <groupId>tk.mybatis</gro
java呼叫CXF WebService介面的兩種方式
通過http://localhost:7002/card/services/HelloWorld?wsdl訪問到xml如下,說明介面寫對了。 2.靜態呼叫 // 建立WebService客戶端代理工廠 JaxWsProxyFact
Java中HashMap遍歷的兩種方式
第一種: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext())
java實現多執行緒的兩種方式繼承Thread類和實現Runnable介面
* 實現方式和繼承方式有什麼區別呢? * 區別: * 繼承Thread:執行緒程式碼存放在Thread子類run方法中 * 實現Runnable:執行緒程式碼存放在介面的子類的run方法
Java讀寫登錄檔兩種方式
一種是使用java提供的,但是隻能獲取HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs下的 另外一種是可以指定任意路徑,因為採用的是cmd的命令。 package com.reg; import java.io.BufferedRea
java多執行緒實現的兩種方式。
java自帶主要有兩種實現多執行緒的方式。第一種:繼承執行緒類Thread,重新run的方法。第二種:實現介面Runnable,重新run方法。我先不說明他們的區別。先看程式碼的實現。第一種方式:public class MyThread extends Thread {
java反射機制——三種獲取class物件的方法
package cn.itcast.reflect.demo; import cn.itcast.bean.demo.Person; /** * * 獲取Class物件的3中方法: * * * */ public class ReflectDemo1 { public st
java及javascript兩種方式獲取YYYY-MM-dd HH:mm:ss格式的日期字符串
con javascrip var ear second -c form imp minutes 一、java方式 String leaveTime=""; SimpleDateFormat sDateFormat=new SimpleDateFormat("YYYY-M