詳しくはjava反射
6119 ワード
1. まず最初の一言を言って、この話はとても重要です!
Javaでは、クラスのオブジェクトの数にかかわらず、同じClassオブジェクトに対応します.
2. 二番目の言葉、java反射は何の役に立ちますか?
そういえばjavaクラスのメンバー変数、メソッドがprivateかどうかは関係なく、反射を用いてクラスのプライベート変数やプライベートメソッドを完全に遊ぶことができます.反射のこの2つの部分が使われているからこそhibernate、springなどのフレームがあります.言い換えれば、反射がなければフレームがありません.
3. いったいjava反射にはどんな具体的な役割がありますか?
総じて、Javaの反射メカニズムは、プログラムが実行時にReflection APIsを介して既知の名前のclassの内部情報(すべての情報)を取得することを可能にする.
分割:
(1)運転時にいずれかの対象が属すると判断するクラス
(2)実行時に任意のクラスを構築するオブジェクト
(3)実行時に任意のクラスが持つメンバー変数とメソッドを判断する
(4)実行時に任意のオブジェクトを呼び出す方法
注意:すべて実行時、java反射は実行時の動作です.
書き込みコード解釈java反射は最も直感的で、一つもありません.以下は私が書いた例で、コードは多くの注釈を書いて理解を増やしました.
RelectionClientの実行結果:
UserDaoImpl [id=1001, name=UserDaoImplName] ---------- public int com.lzg.reflection.UserDaoImpl.add(int,int) public java.lang.String com.lzg.reflection.UserDaoImpl.toString() private java.lang.String com.lzg.reflection.UserDaoImpl.sayHello(java.lang.String) public com.lzg.reflection.User com.lzg.reflection.UserDaoImpl.getUserById(int)public java.lang.String com.lzg.reflection.UserDaoImpl.sayWaihao()--------4-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Javaでは、クラスのオブジェクトの数にかかわらず、同じClassオブジェクトに対応します.
2. 二番目の言葉、java反射は何の役に立ちますか?
そういえばjavaクラスのメンバー変数、メソッドがprivateかどうかは関係なく、反射を用いてクラスのプライベート変数やプライベートメソッドを完全に遊ぶことができます.反射のこの2つの部分が使われているからこそhibernate、springなどのフレームがあります.言い換えれば、反射がなければフレームがありません.
3. いったいjava反射にはどんな具体的な役割がありますか?
総じて、Javaの反射メカニズムは、プログラムが実行時にReflection APIsを介して既知の名前のclassの内部情報(すべての情報)を取得することを可能にする.
分割:
(1)運転時にいずれかの対象が属すると判断するクラス
(2)実行時に任意のクラスを構築するオブジェクト
(3)実行時に任意のクラスが持つメンバー変数とメソッドを判断する
(4)実行時に任意のオブジェクトを呼び出す方法
注意:すべて実行時、java反射は実行時の動作です.
書き込みコード解釈java反射は最も直感的で、一つもありません.以下は私が書いた例で、コードは多くの注釈を書いて理解を増やしました.
package com.lzg.reflection;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public static void main(String[] args) {
User user = new User();
user.setId(1);
user.setName("hello");
System.out.println(user);
}
}
package com.lzg.reflection;
public class UserDaoImpl {
public int id;
private String name;
private String waihao = " ";//
public UserDaoImpl() {
super();
}
public UserDaoImpl(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "UserDaoImpl [id=" + id + ", name=" + name + "]";
}
public User getUserById(int userId) {
// User
User user = new User();
user.setId(100);
user.setName("lzg");
return user;
}
public int add(int a, int b) {
return a + b;
}
private String sayHello(String name) {
return "hello:" + name;
}
public String sayWaihao() {
return waihao;
}
}
package com.lzg.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionClient {
public static void main(String[] args) throws Exception {
// , Class
/**
* Class 3
* 1. Class classType = UserDaoImpl.class;
* 2. Class classType = Class.forName("com.lzg.reflection.UserDaoImpl");
* 3.
* UserDaoImpl userDaoImpl = new UserDaoImpl();
* Class classType2 = userDaoImpl.getClass();
*/
Class classType = Class.forName("com.lzg.reflection.UserDaoImpl");
// , 。
//
Object userDaoImplObject = classType.newInstance();
//
Constructor userDaoImplConstructor = classType.getConstructor(new Class[]{int.class, String.class});
UserDaoImpl userDaoImplOjbect2 = (UserDaoImpl) userDaoImplConstructor.newInstance(new Object[]{1001, "UserDaoImplName"});
System.out.println(userDaoImplOjbect2);
System.out.println("----------");
// UserDaoImpl.java
Method[] userDaoImplMethods = classType.getDeclaredMethods();
for(Method method: userDaoImplMethods) {
System.out.println(method);
}
System.out.println("----------");
//
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
int addResult = (int) addMethod.invoke(userDaoImplObject, new Object[]{1, 3});
System.out.println(addResult);
System.out.println("----------");
//
//getField()
Field idField = classType.getField("id");
System.out.println(idField.getName());
System.out.println("");
//getFields()
Field[] fields = classType.getFields();
for(Field field : fields) {
System.out.println(field.getName());
}
System.out.println("");
//
Field nameField = classType.getDeclaredField("name");
System.out.println(nameField.getName());
System.out.println("");
//
Field[] fields2 = classType.getDeclaredFields();
for(Field field : fields2) {
System.out.println(field.getName());
}
System.out.println("----------");
/**
* java 、 private , 。
* , 、 。
* ? , hibernate、spring , , !
*/
//
Method sayHelloMethod = classType.getDeclaredMethod("sayHello", new Class[]{String.class});
sayHelloMethod.setAccessible(true); // Java
String sayHelloResult = (String) sayHelloMethod.invoke(userDaoImplObject, new Object[]{"lzg"});
System.out.println(sayHelloResult);
//
Field waihaoField = classType.getDeclaredField("waihao");
waihaoField.setAccessible(true); // Java
waihaoField.set(userDaoImplObject, " ");
// private , , 。
System.out.println(((UserDaoImpl)userDaoImplObject).sayWaihao());
}
}
RelectionClientの実行結果:
UserDaoImpl [id=1001, name=UserDaoImplName] ---------- public int com.lzg.reflection.UserDaoImpl.add(int,int) public java.lang.String com.lzg.reflection.UserDaoImpl.toString() private java.lang.String com.lzg.reflection.UserDaoImpl.sayHello(java.lang.String) public com.lzg.reflection.User com.lzg.reflection.UserDaoImpl.getUserById(int)public java.lang.String com.lzg.reflection.UserDaoImpl.sayWaihao()--------4-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------