博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写反射方法
阅读量:4099 次
发布时间:2019-05-25

本文共 5346 字,大约阅读时间需要 17 分钟。

import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;public class ReflectDemo {	public static void main(String[] args) {		// TODO 自动生成的方法存根	}	@Test	public void test() throws Exception{		User u = new User();		//通过Class的forName方法,注意使用目标类的全路径(文件所在包以下路径)		Class clazz = Class.forName("reflect.User");				//反射类的构造方法		//通过无参构造器得到该类的对象		//User user = (User)clazz.newInstance();		Constructor c = clazz.getConstructor(null);		User user = (User)c.newInstance(null);		//通过带参构造器获得该类对象		Constructor c1 = clazz.getConstructor(String.class);		User user1 = (User)c1.newInstance("nick");				//获得方法名为login但是没有参数的method对象		Method method = clazz.getMethod("login",null);		//第一个参数为哪个user对象,第二个参数就是这个方法的参数		method.invoke(u,null);		//获取有参数返回值的方法eat		Method method1 = clazz.getMethod("eat",String.class);		String args = (String)method1.invoke(u,"超人");		//获取带有参数无返回值的静态方法sleep		Method method2 = clazz.getMethod("sleep",String.class);		method2.invoke(null, "蝙蝠侠");				/**************反射类的字段*******************/		//注意需要用getDeclareField方法,getField只能获取到public的字段		Field f = clazz.getDeclaredField("name");		Class type = f.getType();		System.out.println(type);		f.setAccessible(true);		f.set(u, "wang");		String name = (String)f.get(u);		System.out.println(name);	}}class User{	private String name;	private String password;		public User() {		System.out.println("无参构造方法");	}	public User(String name) {		System.out.println("带参数的构造方法"+name);	}	//无参无返回值的方法login	public void login() {		System.out.println("用户登陆");	}	//带参数有返回值的方法eat	public String eat(String name) {		System.out.println("用户"+name+"登陆了");		return "eat";	}	//带有参数无返回值的静态方法	public static void sleep(String name) {		System.out.println(name+"去睡觉了");	}}
public class Stu {	private int age;	private String name;	public String addr;		public Stu(int age, String name, String addr) {		this.age = age;		this.name = name;		this.addr = addr;	} 	public Stu(int age, String name) {		this.age = age;		this.name = name;	} 	private Stu(int age) {		this.age = age;	} 	public Stu() {	}		private int method1(){		return 0;	}	private int method2(int age){		return age;	}	public void print(String name,int age){		System.out.println("hello:"+name+"年龄:"+age);	}		public String print2(String name,int age){		System.out.println("hello:"+name+"年龄:"+age);		return null;	} 	@Override	public String toString() {		return "Student [age=" + age + ", name=" + name + ", addr=" + addr				+ "]";	}	}public class TestStu {	@Test	public void getMsthods() {		Stu student = new Stu();		Class studentClass = student.getClass();		// getDeclaredMethods得到本类中所有方法		Method[] studentMethods = studentClass.getMethods();		Method[] studentMethods2 = studentClass.getDeclaredMethods();		System.out.println("方法个数:"+studentMethods.length);		System.out.println("方法个数:"+studentMethods2.length);		for (Method method : studentMethods) {			//得到返回类型			System.out.print("方法名称和参数:"+method.getName()+"(");			//取得某个方法对应的参数类型数组			Class[] paramsType =  method.getParameterTypes();			for (Class paramType : paramsType) {				System.out.print(paramType.getTypeName()+" ");			}			System.out.print(")");			Class returnType = method.getReturnType();			System.out.println("返回类型:"+returnType.getTypeName());		}		for (Method method : studentMethods2) {			//得到返回类型			System.out.print("private类型的方法名称和参数:"+method.getName()+"(");			//取得某个方法对应的参数类型数组			Class[] paramsType =  method.getParameterTypes();			for (Class paramType : paramsType) {				System.out.print(paramType.getTypeName()+" ");			}			System.out.print(")");			Class returnType = method.getReturnType();			System.out.println("返回类型:"+returnType.getTypeName());		}	}	@Test	public void getConstructors() {		Constructor[] cs2 = Stu.class.getConstructors();		Constructor[] cs22 = Stu.class.getDeclaredConstructors();		System.out.println("构造方法个数:"+cs2.length);		System.out.println("构造方法个数:"+cs22.length);		for (Constructor constructor : cs2) {			String printstr = "(";			//获取某个构造方法中的参数数组			Class[] paramsType = constructor.getParameterTypes();			for (Class parameter : paramsType) {				printstr = printstr+parameter.getTypeName()+",";			}			if(printstr.length()>2){			printstr = printstr.substring(0, printstr.length()-1);			}			System.out.println(printstr+")");		}		for (Constructor constructor : cs22) {			String printstr = "(";			//获取某个构造方法中的参数数组			Class[] paramsType = constructor.getParameterTypes();			for (Class parameter : paramsType) {				printstr = printstr+parameter.getTypeName()+",";			}			if(printstr.length()>2){			printstr = printstr.substring(0, printstr.length()-1);			}			System.out.println(printstr+")");		}	}	@Test	public void getfields() {		//getFields()方法获取的是所有的public的信息				//getDeclaredFields()获取的是该类自己声明的成员变量信息				Class stuClass = Stu.class;				Field[] fs = stuClass.getDeclaredFields();				Field[] fs2 = stuClass.getFields();//仅能获得public类型的变量				for(Field field : fs){					//得到类的变量的类型的类类型					Class fieldType = field.getType();				String fieldTypeStr = fieldType.getName();				//得到成员变量的名称				String fieldname = field.getName();				System.out.println("类型:"+fieldTypeStr+"名称:"+fieldname);				}				for(Field field : fs2){					//得到类的变量的类型的类类型					Class fieldType = field.getType();				String fieldTypeStr = fieldType.getName();				//得到成员变量的名称				String fieldname = field.getName();				System.out.println("类型:"+fieldTypeStr+"名称:"+fieldname);				}	}}

转载地址:http://zgeii.baihongyu.com/

你可能感兴趣的文章
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>