㈠ java裡面反射的原理是什麼
java虛擬機運行時內存有個叫方法區,主要作用是存儲被裝載的類的類型信息。每裝載一個類的時候,java就會創建一個該類的Class對象實例。我們就可以通過這個實例,來訪問這個類的信息。
㈡ 什麼是反射什麼Java反射
java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪
首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作
㈢ JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。
(3)java反射實體擴展閱讀:
JAVA中反射實例:
1、Class superClass=clazz.getSuperclass();//獲取父類。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//構造方法。
System.out.println("getConstructors:"+cons.length)。
參考資料來源:網路: JAVA反射機制
㈣ java反射獲取一個實體類中的另外一個實體類中屬性的值,兩個實體類是關聯關系。
class Test{
public static void main(String[] args) {
A a = new A();
System.out.println(getValueInField(a,"b1","i"));
System.out.println(getValueInField(a,"b2","i"));
System.out.println(getValueInField(a,"b3","i"));
}
public static Object getValueInField(Object obj,String field,String name){
//三個參數分別是外部的類的對象obj,作為成員屬性的類的引用名,要查詢的類內部的屬性名
try {
Object o = obj.getClass().getDeclaredField(field).get(obj);
return o.getClass().getDeclaredField(name).get(o);
} catch (Exception e) {
System.out.println("查找失敗");
return null;
}
}
}
class A{
B b1 = new B(1);
B b2 = new B(2);
}
class B{
int i;
B(int i){
this.i = i;
}
}
㈤ Java的反射到底有什麼用途
JDK動態代理生成代理類的位元組碼後,首先把這個類通過defineclass定義成一個類,然後用class.for(name)會把該類載入到jvm,之後我們就可以通過,A.class.GetMethod()獲取其方法,然後通過invoke調用其方法,在調用這個方法時,實際上會通過被代理類的引用再去調用原方法。
Java反射包reflection提供對Class,Method,field,constructor1 等信息的封裝類型
通過這些api可以輕易獲得一個類的各種信息並且可以進行實例化,方法調用等。
類中的private參數可以通過setaccessible方法強制獲取。
㈥ java的反射技術有什麼用
一、反射的概述
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的位元組碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼文件對應的Class類型的對象.
以上的總結就是什麼是反射
反射就是把java類中的各種成分映射成一個個的Java對象
例如:一個類有:成員變數、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)
如圖是類的正常載入過程:反射的原理在與class對象。
熟悉一下載入的時候:Class對象的由來是將class文件讀入內存,並為之創建一個Class對象。
希望對您有所幫助!~
㈦ JAVA從資料庫查出來的數據放到實體類想用反射的方法給他們賦值,怎麼做
說一個大概思路吧:
1.讀取數據:從資料庫中讀取數據的同時,拿到元數據,即metadata;
2.實例化:通過類名,利用反射 實例你的實體類(類名可以和表名保持一致,這樣就不用寫額外的
映射了),如果你只是想通過反射賦值的話,你也可以直接new個類;
3.方法調用:通過元數據,利用反射 得到你的set方法(方法名可以和欄位名保持一致,否則你要寫
出映射關系);
㈧ 如何通過java反射將資料庫表生成實體類
首先有幾點聲明:
1、代碼是在別人的基礎進行改寫的;
2、大家有什麼改進的意見可以告訴我,也可以自己改好共享給其他人;
3、剛剛畢業,水平有限,肯定有許多不足之處;
4、希望剛剛學習java的同學能有所啟發。
//這個是做轉換的類,裡面的DB只是封裝了資料庫的連接,大家可以用自己的,隨意
package com.tt.util.gen.entity.tool;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import com.tt.util.DB;
public class GenEntityMysql {
private String packageOutPath;// 指定實體生成所在包的路徑
private String authorName;// 作者名字
private String tablename;// 表名
private String databasename;// 資料庫名
private List<String> tablenames;// 拿到對應資料庫中所有的實體類(實體類需要與其他表明做區分)
private List<String> colnames; // 列名集合
private List<String> colTypes; // 列名類型集合
private boolean f_util = false; // 是否需要導入包java.util.*
private boolean f_sql = false; // 是否需要導入包java.sql.*
/*
* 構造函數
*/
public GenEntityMysql() {
// 使用properties讀取配置文件
Properties prop = new Properties();
try {
InputStream genentity = getClass().getResourceAsStream(
"/genentity.properties");
prop.load(genentity);
if (genentity != null) {
genentity.close();
}
} catch (Exception e) {
System.out.println("file " + "catalogPath.properties"
+ " not found!\n" + e);
}
this.databasename = prop.getProperty("databasename").toString();
this.tablename = prop.getProperty("tablename").toString();
this.packageOutPath = prop.getProperty("packageOutPath").toString();
this.authorName = prop.getProperty("authorName").toString();
}
// 創建多個實體類
private void genEntity(List<String> tablenames, Connection conn) {
// 使用第歸生成文件
for (String tablename : tablenames) {
this.genEntity(tablename, conn);
}
}
// 創建單個實體類
private void genEntity(String tablename, Connection conn) {
String sql = "select * from " + tablename;
PreparedStatement pstmt = null;
ResultSetMetaData rsmd = null;
try {
pstmt = DB.getPStmt(conn, sql);
rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 統計列
colnames = new ArrayList<String>();
colTypes = new ArrayList<String>();
for (int i = 0; i < size; i++) {
colnames.add(rsmd.getColumnName(i + 1));
colTypes.add(rsmd.getColumnTypeName(i + 1));
if (colTypes.get(i).equalsIgnoreCase("datetime")) {
f_util = true;
}
if (colTypes.get(i).equalsIgnoreCase("image")
|| colTypes.get(i).equalsIgnoreCase("text")) {
f_sql = true;
}
}
System.out.println(colnames);
System.out.println(colTypes);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
DB.close(pstmt);
}
// 在內存中生成代碼
String content = parse(tablename);
// 寫入到文件中
try {
File directory = new File("");
String outputPath = directory.getAbsolutePath() + "/src/"
+ this.packageOutPath.replace(".", "/") + "/";
System.out.println("寫出的路徑:" + outputPath);
// 檢測路徑是否存在,不存在就創建路徑
File path = new File(outputPath);
if (!path.exists() && !path.isDirectory()) {
path.mkdir();
System.out.println(path.exists());
}
// 創建文件
outputPath += initcap(tablename) + ".java";
File file = new File(outputPath);
if (!file.exists()) {
file.createNewFile();
}
// 寫出到硬碟
FileWriter fw = new FileWriter(file);
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void getAllEntityTable(Connection conn, List<String> tablenames) {
ResultSet rs = null;
try {
DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
/*
* TABLE_CAT String => 表類別(可為 null)
* TABLE_SCHEM String => 表模式(可為null)
* TABLE_NAME String => 表名稱
* TABLE_TYPE String => 表類型
*/
rs = dmd.getTables(null, null, "%", null);
while (rs.next()) {
tablenames.add(rs.getString("TABLE_NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
*
* @param tablename
* @return
*/
private String parse(String tablename) {
StringBuffer sb = new StringBuffer();
// 判斷是否導入工具包
if (f_util) {
sb.append("import java.util.Date;\r\n");
}
if (f_sql) {
sb.append("import java.sql.*;\r\n");
}
sb.append("package " + this.packageOutPath + ";\r\n");
sb.append("\r\n");
// 注釋部分
sb.append(" /**\r\n");
sb.append(" * " + tablename + " 實體類\r\n");
sb.append(" * " + new Date() + " " + this.authorName + "\r\n");
sb.append(" */ \r\n");
// 實體部分
sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");
processAllAttrs(sb);// 屬性
processAllMethod(sb);// get set方法
sb.append("}\r\n");
return sb.toString();
}
/**
* 功能:生成所有屬性
*
* @param sb
*/
private void processAllAttrs(StringBuffer sb) {
for (int i = 0; i < colnames.size(); i++) {
sb.append("\tprivate " + sqlType2JavaType(colTypes.get(i)) + " "
+ colnames.get(i) + ";\r\n");
}
}
/**
* 功能:生成所有方法
*
* @param sb
*/
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.size(); i++) {
sb.append("\tpublic void set" + initcap(colnames.get(i)) + "("
+ sqlType2JavaType(colTypes.get(i)) + " " + colnames.get(i)
+ "){\r\n");
sb.append("\t\tthis." + colnames.get(i) + "=" + colnames.get(i)
+ ";\r\n");
sb.append("\t}\r\n");
sb.append("\tpublic " + sqlType2JavaType(colTypes.get(i)) + " get"
+ initcap(colnames.get(i)) + "(){\r\n");
sb.append("\t\treturn " + colnames.get(i) + ";\r\n");
sb.append("\t}\r\n");
}
}
/**
* 功能:將輸入字元串的首字母改成大寫
*
* @param str
* @return
*/
private String initcap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}
/**
* 功能:獲得列的數據類型
*
* @param sqlType
* @return
*/
private String sqlType2JavaType(String sqlType) {
if (sqlType.equalsIgnoreCase("bit")) {
return "boolean";
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return "byte";
} else if (sqlType.equalsIgnoreCase("smallint")) {
return "short";
} else if (sqlType.equalsIgnoreCase("int")) {
return "int";
} else if (sqlType.equalsIgnoreCase("bigint")) {
return "long";
} else if (sqlType.equalsIgnoreCase("float")) {
return "float";
} else if (sqlType.equalsIgnoreCase("decimal")
|| sqlType.equalsIgnoreCase("numeric")
|| sqlType.equalsIgnoreCase("real")
|| sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")) {
return "double";
} else if (sqlType.equalsIgnoreCase("varchar")
|| sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("nvarchar")
|| sqlType.equalsIgnoreCase("nchar")
|| sqlType.equalsIgnoreCase("text")) {
return "String";
} else if (sqlType.equalsIgnoreCase("datetime")) {
return "Date";
} else if (sqlType.equalsIgnoreCase("image")) {
return "Blod";
}
return null;
}
/**
* 出口 TODO
*
* @param args
*/
public static void main(String[] args) {
new GenEntityMysql().start();
}
private void start() {
// 創建連接
Connection conn = DB.getConn();
if (databasename != null && !databasename.equals("")
&& tablename != null && !tablename.equals("")) {
System.out.println("databasename 和 tablename 不能同時存在");
} else {
// 如果配置文件中有資料庫名字,則可以拿到其中所有的實體類
if (databasename != null && !databasename.equals("")) {
// 獲取所有實體表名字
tablenames = new ArrayList<String>();
getAllEntityTable(conn, tablenames);
System.out.println(tablenames);
// 為每個實體表生成實體類
genEntity(tablenames, conn);
} else {
// 為指定實體表生成實體類
genEntity(tablename, conn);
}
// 關閉資料庫連接
if (conn != null) {
DB.close(conn);
}
}
}
}