java 反射機制 方法;構造方法;


如果操作類中的方法;

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

  

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM