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();
}
}