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

  

  

 

  

越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13055386.html