zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    [CF1355] Codeforces Round #643 (Div. 2)
    [ABC189] AtCoder Beginner Contest 189
    P3702 [SDOI2017]序列计数 (三模数NTT)
    P3321 [SDOI2015]序列统计 (NTT快速幂)
    洛谷P4157 [SCOI2006]整数划分
    洛谷P2553 [AHOI2001]多项式乘法
    洛谷P1919 (模板)A*B Problem升级版(FFT快速傅里叶)
    MySQL学习总结-详细版(包括下载安装)
    查看oracle数据库中表是否被锁
    SQL优化(面试题)
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13055386.html
Copyright © 2011-2022 走看看