如果操作類中的方法;
Class類中的方法
Method a=getMethod("方法名",Class...參數類型);
Method[]=getMethods(); //獲取所有的方法(公有的 自己類+父類)
Method=getDeclaredMethod("方法名字",參數類型的class..);//獲取一個方法
Method[] =getDeclaredMethods();獲取全部方法 (公有的 自己類+父類)
Class類中的構造方法
Constructor c=getConstructor(Class...參數類型)
Method類中的常用
int mm=a.getModifiers();//獲取方法的修飾符(權限+特征)
Class mrt=a.getReturnType();//獲取返回值數據類型
String mn=a.getName();//獲取方法的名字
Class[] mpts=a.getParameterTypes();//獲取方法參數列表的類型
Class[] mets=a.getExceptionTypes();//獲取方法拋出異常的類型
如何操作方法
調用方法 讓他執行一次
Object r=invoke(對象,執行方法需要傳遞的所有參數..);
若方法是私有的,不允許操作
可以設置setAccessible(true);
Constructor類中的常用方法;
getModifiers();//獲取方法的修飾符(權限+特征)
getName();//獲取方法的名字
Class[] =getParameterTypes();//獲取方法參數列表的類型
getExceptionTypes();
如何操作構造方法
執行一次 創建對象
Object=newInstance(執行構造方法時的所有參數);
package test0606;
public class Animal{
public String names;
private int ages;
public void sleep(){
System.out.println("睡覺");
}
}
package test0606;
public class Person extends Animal{
public String name;
private int age;
Public Person(){
}
public String toString(){
return "{name:"+name+","+"age:"+age+"}";
}
public void eat(){
System.out.println("無參數吃飯");
}
public String eat(String n){
System.out.println(n+"參數吃飯");
return n;
}
private void drink(){
System.out.println("參數吃飯");
}
}
package test0606;
import java.lang.reflect.*;
@SuppressWarnings("unchecked")
public class TestMain{
public static void main(String[] args){
try{
Class a=Person.class;
Person p=(Person)a.newInstance();
//先通過方法名字定位方法 通過方法參數類型對應的Class來找尋
Method m=a.getMethod("eat",String.class);
String rs=(String)m.invoke(p,"abd");
System.out.println(rs);
Method ma=a.getMethod("sleep");
ma.invoke(p);
Method[] ms=a.getMethods();//獲取所有公有的方法(自己類+父類);
Method mma=a.getDeclaredMethod("drink");
System.out.println(mma.getName());
mma.setAccessible(true);
mma.invoke(p);
/*
Method m=a.getMethod("eat");
int mf=m.getModifiers();//獲取方法的修飾符
Class mrt=m.getReturnType();//獲取返回值數據類型
String mn=m.getName();//獲取方法的名字
Class[] mpts=m.getParameterTypes();//獲取方法參數列表的類型
Class[] mets=m.getExceptionTypes();//獲取方法拋出異常的類型;
*/
}catch(Exception e){
e.printStackTrace();
}
}
}
------------------------------------------------------------------------
IOC(控制反轉);DI(依賴注入);
package test0606;
public class Animal{
public String names;
private Integer ages;
public Animal(){
}
public Animal(String names){
this.names=names;
}
public String toString(){
return names+"=="+ages;
}
public void setNames(String names){
this.names=names;
System.out.println("names"+names);
}
public void setAges(Integer age){
this.ages=age;
System.out.println("age:"+age);
}
}
package test0606;
import java.lang.reflect.*;
import java.util.Scanner;
@SuppressWarnings("unchecked")
public class Spring{
public Object getb(String name){
Object o=null;
Scanner input=new Scanner(System.in);
try{
Class a=Class.forName(name);
o=a.newInstance();
//在這里做一個自動DI注入 對象中的所有屬性值
//1.找尋所有私有屬性--獲取每一個屬性的名字--set屬性
Field[] fds=a.getDeclaredFields();
for(Field v:fds){
String fn=v.getName();//屬性名稱
String firstLetter=fn.substring(0,1).toUpperCase();
String otherLetter=fn.substring(1);
StringBuilder sb=new StringBuilder("set");//拼接屬性名稱
sb.append(firstLetter);
sb.append(otherLetter);
Class typee=v.getType(); //屬性類型
Method md=a.getMethod(sb.toString(),typee);//方法
System.out.println("請給屬性:"+fn+"賦值");
String value=input.nextLine();
//需要執行屬性對應的set方法 給屬性賦值 方法就結束啦
//可以利用包裝類帶String的構造方法處理 屬性類型對應的帶String參數的構造方法
//new Integer(String);
Constructor con=typee.getConstructor(String.class);
md.invoke(o,con.newInstance(value));
//System.out.println(sb.toString());
}
}catch(Exception e){
e.printStackTrace();
}
return o;
}
}
package test0606;
//import java.lang.reflect.*;
@SuppressWarnings("unchecked")
public class TestMain{
public static void main(String[] args){
Spring s=new Spring();
Animal a=(Animal)s.getb("test0606.Animal");
//a.sleep();
System.out.println(a);
}
}
