Java反射:賦值,設(shè)置,通過(guò)反射調(diào)用getter和setter方法,Tools類(lèi)【詩(shī)書(shū)畫(huà)唱】
Class.forName()加載類(lèi)
getDeclaredMethod
自己總結(jié)的語(yǔ)法或重要提醒內(nèi)容等:
// 自己總結(jié)的語(yǔ)法(多記錄自己總結(jié)的語(yǔ)法,之后用等):
// 當(dāng)setXXX等的方法有一個(gè)參數(shù)時(shí)
//
// setDeclaredMethod("setXXX",包裝類(lèi)類(lèi)型名.class)




1、創(chuàng)建Product商品類(lèi),包含商品名稱(chēng)name和商品價(jià)格price兩個(gè)屬性以及getter和setter,通過(guò)反射調(diào)用Product的getter和setter方法,設(shè)置商品名稱(chēng)是衛(wèi)龍辣條,價(jià)格是6.5并打印出來(lái)。

//每個(gè)類(lèi)沒(méi)寫(xiě)東西時(shí),有一個(gè)默認(rèn)的構(gòu)造方法
//(當(dāng)寫(xiě)了自己建的構(gòu)造方法時(shí),默認(rèn)構(gòu)造方法就沒(méi)有)
package ClassfanShe;
//下面的class前不可加public等
class Product {
String name;
// 下面的price等前面不可以用double,最好都用包裝類(lèi)Double等:
Double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}


package ClassfanShe;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class PsetGet {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class c = Class.forName("ClassfanShe.Product");
Object nameSet = c.newInstance();
//? 用getDeclaredMethod獲取到setXXX方法:
Method Method1 = c.getDeclaredMethod("setName",String.class);
// 用invoke調(diào)用getXXX方法:
Method1.invoke(nameSet, "衛(wèi)龍辣條");
?
// 用getDeclaredMethod獲取getXXX方法
Method Method2 = c.getDeclaredMethod("getName");
Object nameGet = Method2.invoke(nameSet);
?
?
System.out.println((String)nameGet);
//——————————
// 自己總結(jié)的語(yǔ)法(多記錄自己總結(jié)的語(yǔ)法,之后用等):
// 當(dāng)setXXX等的方法有一個(gè)參數(shù)時(shí)
//
// setDeclaredMethod("setXXX",包裝類(lèi)類(lèi)型名.class)
?
Method Method11 = c.getDeclaredMethod("setPrice", Double.class);
Object priceSet = c.newInstance();
Method11.invoke(priceSet, 6.5);
Method Method22 = c.getDeclaredMethod("getPrice");
Object priceGet = Method22.invoke(priceSet);
System.out.println(priceGet);
// ——————————
System.out.println("商品名稱(chēng)是"+nameGet+",價(jià)格是"+priceGet+"元");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


2、定義一個(gè)類(lèi)Person,包含屬性name、age。使用反射的方式創(chuàng)建一個(gè)實(shí)例、使用反射方式給name和age屬性賦值為小明和18歲。

package ClassfanShe;
public class Person {
String name;
Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}


package ClassfanShe;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class PersonFS {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class c = Class.forName("ClassfanShe.Person");
Object nameSet = c.newInstance();
Method Method1 = c.getDeclaredMethod("setName",String.class);
Method1.invoke(nameSet, "小明");
?
Method Method2 = c.getDeclaredMethod("getName");
Object nameGet = Method2.invoke(nameSet);
?
// ——————————
?
Method Method11 = c.getDeclaredMethod("setAge", Integer.class);
Object ageSet = c.newInstance();
Method11.invoke(ageSet, 18);
Method Method22 = c.getDeclaredMethod("getAge");
Object ageGet = Method22.invoke(ageSet);
// ——————————
System.out.println("詩(shī)書(shū)畫(huà)唱告訴你,此人為"+nameGet
+",年齡為"+ageGet+"歲");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


3、創(chuàng)建一個(gè)Tools類(lèi),定義一個(gè)帶兩個(gè)Integer類(lèi)型參數(shù)的add方法,返回值是這兩個(gè)參數(shù)的和,通過(guò)反射調(diào)用這個(gè)方法,并打印出結(jié)果。
上面的類(lèi)中再定義一個(gè)方法,此方法可以獲取obj對(duì)象中名為propertyName的屬性的值(個(gè)人理解:就是屬性名,取名不一定為propertyName)。
上面的類(lèi)中再定義一個(gè)方法,此方法可將obj對(duì)象中名為propertyName的屬性的值(個(gè)人理解:就是屬性名,取名不一定為propertyName)設(shè)置為value.
下面提供參考,不一定要用:
public class Tools {
? ? public void setProp(Student obj,String propName,Object value){
? ? //..?
? ? }
? ??
? ? public static void main(String[] args) {
? ? Tools t = new Tools();
? ? Student s = new Student();
? ? t.setProp(s, "name","李四");
? ? t.setProp(s, "age",12);
}
}

package ClassfanShe;
public class Student {
String propertyName;
Integer age;
}


package ClassfanShe;
class Tools {
Integer a;
Integer b;
private Student obj;
private String propName;
private Object value;
public int add(Integer a,Integer b) {
return a + b;
}
public? String setProp(Student obj,String propName,Object value){
return propName;
? ? }
public? Object setProp(Student obj,Object propName,Object value){
return propName=value;
? ? }
}


package ClassfanShe;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class ToolsFS {
public static void main(String[] args) {
try {
System.out.println("下面是調(diào)用獲取屬性名字的方法:");
Class c = Class.forName("ClassfanShe.Tools");
Object nameSet = c.newInstance();
Method Method1 = c.getDeclaredMethod("setProp",
Student.class,String.class,Object.class);
Tools t = new Tools();
Student s = new Student();
//t.setProp(s, "name","李四");
//
//t.setProp(s, "age",12);
System.out.println("1:"+?
Method1.invoke(nameSet, s, "name","李四")+"\n");?
System.out.println("2:"+?
Method1.invoke(nameSet, s, "age",12)+"\n");?
System.out.println("將obj對(duì)象中名為"
+ "屬性名設(shè)置為value并且返回出來(lái):");
Method Method11 = c.getDeclaredMethod("setProp",
Student.class,Object.class,Object.class);
System.out.println("1:"+?
Method11.invoke(nameSet, s, "name","李四")+"\n");?
System.out.println("2:"+?
Method11.invoke(nameSet, s, "age",12)+"\n");?
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



package ClassfanShe;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class TwoFS {
public static void main(String[] args) {
try {
System.out.println("下面是調(diào)用add方法:");
Class c = Class.forName("ClassfanShe.Tools");
Object nameSet = c.newInstance();
Method Method1 = c.getDeclaredMethod("add",
Integer.class,Integer.class);
?
System.out.println("1+2="+ Method1.invoke(nameSet, 1,2)+"\n");?
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


后記
每次寫(xiě)代碼等最好是總結(jié)一些重點(diǎn)代碼單詞或自己總結(jié)的語(yǔ)法或自己的理解來(lái)記憶,別的方面也要自己學(xué)會(huì)總結(jié)一些自己認(rèn)為重要的內(nèi)容。
自己認(rèn)為常用的,用處大等的就是我所認(rèn)為重要的。