zoukankan      html  css  js  c++  java
  • Java反射学习

    1.UserBean

    package reflect;
    
    public class UserBean {
    	public String userName;
    	
    	private int userId;
    
    	public UserBean(){
    		this.userName ="nisir";
    		this.userId = 1;
    	}
    
    	public UserBean(String userName, int userId){
    		this.userName = userName;
    		this.userId = userId;
    	}
    	
    	public String getName(){
    		return userName;
    	}
    	
    	public int getId(){
    		return userId;
    	}
    
    	private void setName(String userName){
    		this.userName = userName;
    	}
    	
    	public static void hello(){
    		System.out.println("hello");
    	}
    		
    }
    
    

    2.Main

    package reflect;
    
    import java.lang.reflect.*;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Class<?> userBeanClass  = UserBean.class;
    		printFields(userBeanClass);
    		printMethods(userBeanClass);
    		printConstructor(userBeanClass);
    		invokeMethods(userBeanClass);
    	}
    	
    	public static <T> void printFields(Class<T> userBeanClass){
    		System.out.println("
    ==================Field======================");
    		Field[] fields = userBeanClass.getDeclaredFields(); 
    		for (Field field : fields){
    			String fieldString = "";
    			fieldString+=Modifier.toString(field.getModifiers()) + " ";  //private、static、protect、public等修饰符
    			fieldString+=field.getType().getSimpleName() + " "; // String、int等域类型
    			fieldString+=field.getName(); //userName、userId等域名
    			fieldString+=";";
    			System.out.println(fieldString);
    		}
    	}
    	
    	public static <T> void printMethods(Class<T> userBeanClass){
    		System.out.println("
    ==================Method======================");
    		Method[] methods = userBeanClass.getDeclaredMethods();
    		for (Method method:methods){
    			String methodString = "";
    			methodString += Modifier.toString(method.getModifiers()) + " "; //private、static、protect、public等修饰符
    			methodString += method.getReturnType().getSimpleName() + " "; //String、int等返回类型
    			methodString += method.getName() + "(";
    			Class<?>[] parameters = method.getParameterTypes(); //获取方法包含的参数类型
    			for (Class<?> parameter : parameters){
    				methodString += parameter.getSimpleName() + " "; //参数类型
    			}
    			methodString += ")";
    			System.out.println(methodString);
    		}
    	}
    	
    	public static <T> void printConstructor(Class <T> userBeanClass){
    		System.out.println("
    ==================Constructor======================");
    		Constructor<?> [] constructors = userBeanClass.getDeclaredConstructors();
    		for (Constructor<?> constructor:constructors){
    			String constructorString="";
    			constructorString += Modifier.toString(constructor.getModifiers()) + " "; //private、static、protect、public等修饰符
    			constructorString +=constructor.getName() + "(";
    			Class<?>[] parameters = constructor.getParameterTypes();//获取构造函数包含的参数类型
    			for (Class<?> parameter : parameters){
    				constructorString+=parameter.getSimpleName()+ ", "; //参数类型
    			}
    			constructorString =constructorString.substring(0, constructorString.length()-1);
    			constructorString+=")";
    			System.out.println(constructorString);
    		}
    	}
    	
    	public static <T> void invokeMethods(Class <T> userBeanClass){
    		System.out.println("
    ==================Invoke Method======================");
    		try {
    			Class<?>[] params = {String.class, int.class};
    			Constructor<?> defaultConstructor = userBeanClass.getDeclaredConstructor(); //获取默认构造函数
    			Object userBean1 = defaultConstructor.newInstance(); //通过默认构造函数实例化一个对象
    			Constructor<?> paramConstructor = userBeanClass.getDeclaredConstructor(params);//获取带参数的构造函数
    			Object userBean2 = paramConstructor.newInstance("Nizhifeng", 2);//通过构造函数实例化一个对象
    			
    			//获取各个方法
    			Method getNameMethod = userBeanClass.getDeclaredMethod("getName");
    			Method getIdMethod = userBeanClass.getDeclaredMethod("getId");
    			Method setNameMethod = userBeanClass.getDeclaredMethod("setName", String.class);
    			Method helloMethod = userBeanClass.getDeclaredMethod("hello");
    			
    			//user1
    			Object name = getNameMethod.invoke(userBean1);
    			Object id = getIdMethod.invoke(userBean1);
    			System.out.println("user1 is "+name);
    			System.out.println("user1's id is "+ id);
    			setNameMethod.setAccessible(true); //private方法必须setAccessible后才能invoke
    			setNameMethod.invoke(userBean1, "cy");
    			name = getNameMethod.invoke(userBean1);
    			System.out.println("user1 changed to " + name);
    			
    			//user2
    			name = getNameMethod.invoke(userBean2);
    			System.out.println("user2 is "+name);
    			id = getIdMethod.invoke(userBean2);
    			System.out.println("user2's id is " + id);
    			
    			helloMethod.invoke(null);//静态方法不需要传实例对象
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    
    

    3.输出

    
    ==================Field======================
    public String userName;
    private int userId;
    
    ==================Method======================
    public String getName()
    private void setName(String )
    public int getId()
    public static void hello()
    
    ==================Constructor======================
    public reflect.UserBean)
    public reflect.UserBean(String, int,)
    
    ==================Invoke Method======================
    user1 is nisir
    user1's id is 1
    user1 changed to cy
    user2 is Nizhifeng
    user2's id is 2
    hello
    
    
  • 相关阅读:
    ES6学习笔记(七)-对象扩展
    ES6学习笔记(四)-数值扩展
    ES6学习笔记(三)-正则扩展
    ES6学习笔记(二)-字符串的扩展
    ES6学习笔记(一)-变量的解构赋值
    webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
    CSS之Flex 布局
    iscsi
    DHCP
    DNS
  • 原文地址:https://www.cnblogs.com/znicy/p/6785026.html
Copyright © 2011-2022 走看看