如果操作类中的方法;
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); } }