1. 程式人生 > >Java反射機制及其獲取InputStream的兩種方式

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