java反射set
① java反射的幾個方法區別
1. 通過Object類的getClass方法來獲取
java.lang.Object中定義有getClass方法:public final Class getClass()
所有Java對象都具備這個方法,該方法用於返回調用該方法的對象的所屬類關聯的Class對象,例如:
Date date1 = new Date();
Date date2 = new Date();
Class c1 = date1.getClass();
Class c2 = date2.getClass();
System.out.println(c1.getName());
// java.util.Date
System.out.println(c1 == c2);
// true
上面的代碼中,調用Date對象date1的getClass方法將返回用於封裝Date類信息的Class對象。
這里調用了Class類的getName方法:public String getName(),這個方法的含義很直觀,即返回所封裝的類的名稱。
需要注意的是,代碼中的date1和date2的getClass方法返回了相同的Class對象(c1==c2的值為true)。這是因為,對於相同的類,JVM只會載入一次,而與該類對應的Class對象也只會存在一個,無論該類實例化了多少對象。
另外,需要強調的是,當一個對象被其父類的引用或其實現的介面類型的引用所指向時,getClass方法返回的是與對象實際所屬類關聯的Class對象。例如:
List list = new ArrayList();
System.out.println(list.getClass().getName()); // java.util.ArrayList
上面的代碼中,語句list.getClass()方法返回的是list所指向對象實際所屬類java.util.ArrayList對應的 Class對象而並未java.util.List所對應的Class對象。有些時候可以通過這個方法了解一個對象的運行時類型,例如:
HashSet set = new HashSet();
Iterator it = set.iterator();
System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator
從代碼可以看出,HashSet的iterator方法返回的是實現了Iterator介面的HashMap內部類(KeyIterator)對象。
因為抽象類和介面不可能實例化對象,因此不能通過Object的getClass方法獲得與抽象類和介面關聯的Class對象。
2. 使用.class的方式
使用類名加「.class」的方式即會返回與該類對應的Class對象。例如:
Class clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
這個方法可以直接獲得與指定類關聯的Class對象,而並不需要有該類的對象存在。
3. 使用Class.forName方法
Class有一個著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException
該方法可以根據字元串參數所指定的類名獲取與該類關聯的Class對象。如果該類還沒有被裝入,該方法會將該類裝入JVM。
該方法聲明拋出ClassNotFoundException異常。顧名思義,當該方法無法獲取需要裝入的類時(例如,在當前類路徑中不存在這個類),就會拋出這個異常。
② java反射給欄位賦值就是給實體類的set賦值,怎麼做
親,以下是我寫的例子,你可以參考:
import java.lang.reflect.Field;
import java.util.Arrays;
import static java.lang.System.out;
enum Tweedle { DEE, DUM }
public class Book {
public long chapters = 0;
public String[] characters = { "Alice", "White Rabbit" };
public Tweedle twin = Tweedle.DEE;
public static void main(String... args) {
Book book = new Book();
String fmt = "%6S: %-12s = %s%n";
try {
Class<?> c = book.getClass();
Field chap = c.getDeclaredField("chapters");
out.format(fmt, "before", "chapters", book.chapters);
chap.setLong(book, 12);
out.format(fmt, "after", "chapters", chap.getLong(book));
Field chars = c.getDeclaredField("characters");
out.format(fmt, "before", "characters",
Arrays.asList(book.characters));
String[] newChars = { "Queen", "King" };
chars.set(book, newChars);
out.format(fmt, "after", "characters",
Arrays.asList(book.characters));
Field t = c.getDeclaredField("twin");
out.format(fmt, "before", "twin", book.twin);
t.set(book, Tweedle.DUM);
out.format(fmt, "after", "twin", t.get(book));
// proction code should handle these exceptions more gracefully
} catch (NoSuchFieldException x) {
x.printStackTrace();
} catch (IllegalAccessException x) {
x.printStackTrace();
}
}
}
輸出:
BEFORE: chapters = 0
AFTER: chapters = 12
BEFORE: characters = [Alice, White Rabbit]
AFTER: characters = [Queen, King]
BEFORE: twin = DEE
AFTER: twin = DUM
如果對你有幫助的話,請點贊一下。如果有任何問題,都可以聯系我!
③ Java反射問題
按照你的要求編寫的用反射調用test方法的Java程序如下
Outter.java文件
public class Outter {
private Inner in;
public Outter(){
in=new Inner();
}
private class Inner {
private void test(){
System.out.println("test");
}
}
}
④ 什麼是java反射技術,有沒有核心代碼
看個例子吧 也算不上核心 幫助理解下反射
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Admin {
public Admin(){ }
private String id = "";
public String getId() {
System.out.print(id);
return id;
}
public void setId(String id) {
this.id = id;
}
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
String str = "test.Admin";
Class c = Class.forName(str);
Object obj = c.newInstance(); //得到Admin類
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); //這里是設置屬性的值的方法(setId方法名)
m.invoke(obj,new Object[]{"admin"}); //調用方法<實體類,參數>)
m = c.getMethod("getId",new Class[]{}); //這里是里獲取屬性的值
m.invoke(obj,new Object []{});
}
}
⑤ Java反射機制獲取set()方法 並且為set()方法傳值
package com.knowhowinfo;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test {
public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, SecurityException, NoSuchMethodException {
Class<A> c = A.class;
//返回所有的方法
Method[] ms = c.getDeclaredMethods();
A a = c.newInstance();
for (Method method : ms) {
//這里遍歷一下 可有可以無 實驗而已
System.out.println(method);
}
Method m = c.getDeclaredMethod("set", int.class,String.class);
m.setAccessible(true);//因為寫成private 所以這里必須設置
m.invoke(a, 5,"你好");
}
}
class A{
private void set(int i,String s){
System.out.println(i+","+s);
};
}這是效果圖,相信你能看的懂
⑥ java反射機是否制擴大了訪問范圍,破壞了安全性
就算是反射也只能通過調用set方法來修改Salary的值啊
⑦ java反射如何為long型賦值
Method method=........;//如,bean 的 set方法
method.invoke(anObjectInstance, 1234L);
Field field = ........//如一個public 的屬性
field.set(anObjectInstance, 1234L);
⑧ java反射怎麼設置屬性獲取屬性
Field 有方法 get/set
Object get(Object obj)Returns the value of the field represented by this Field, on
the specified object.
~~~~~~~~~~
void set(Object obj, Object value)Sets the field represented by this Field object on the
specified object argument to the specified new value.
~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
⑨ Java反射賦值會調用set方法嗎
不會。set/get方法只是javaBean的規范,用來統一管理Bean屬性的賦值操作。
⑩ 利用JAVA反射技術執行一個類的方法
public class Test {
public Test() {
}
public static void main(String[] args) throws IllegalArgumentException,
SecurityException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
Bean bean = new Bean();
System.out.println(bean);
Bean.class.getMethod("setName", String.class).invoke(bean, "Jerry");
Bean.class.getMethod("setAge", int.class).invoke(bean, 25);
System.out.println("After reflection....\n" + bean);
}
}
class Bean {
private String name;
private int age;
public Bean() {
}
public Bean(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 String toString() {
return "NAME: " + this.getName() + "\nAGE: " + this.getAge();
}
}