Java反射入门,Fighting!!!GOGOGOGOGGOGOGo!!!!!

昨晚我刚开始看这个反射的视屏课,放了两节,电脑卡崩了。等了半小时,毫无动静。无奈之下,洗洗睡咯。今日无事重拾电脑,细细琢磨反射为何。
反射就是知道在虚拟机中运行的类叫啥名字嘛,有啥方法,构造方法成员变量,要传入什么参数。巴拉巴拉

具体真正信息在下:
反射的概述
什么是Java的反射机制?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
对于任意对象,都能够调用它的任意方法和属性
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
Java反射机制的作用:
用来编写一些通用性较高的代码或者框架的时候使用。
A.java 经过编译变为A.class,A.class到jvm中运行

反射常用对象的概述
Class Class对象:类的字节码文件被加载到内存所形成的一个对象
Class类的实例表示正在运行的Java应用程序中的类和接口
Constructor
关于类的单个构造方法的信息以及对它的访问权限
Field
Field提供有关类或接口的单个字段信息,以及对它的动态访问权限
Method
Method 提供关于类或接口上单独某个方法的信息

代码示例:

//先弄一个Person类用于测试
public class Person {
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + "]";
	}

	public String name;
	private String sex;
	public Person(String name, String sex) {
	
		this.name = name;
		this.sex = sex;
	}
	public Person() {
		super();
	}
//	public String getName() {
//		return name;
//	}
//	public void setName(String name) {
//		this.name = name;
//	}
//	public String getSex() {
//		return sex;
//	}
//	public void setSex(String sex) {
//		this.sex = sex;
//	}
	public String sayHello(String name){
		return "hello"+name;
	}
	public void eat(){
		System.out.println("yamiyami");
	}
	private void run(){
		System.out.println("running");
	}
}



//测试class对象
public class ClassTest {
	@Test
	/*
	 * 获得Class对象
	 *  1、通过类名.class
	 *   2、对象.getClass()
	 *    3、Class.forName();
	 */
	public void demo1() throws ClassNotFoundException {
		// 1、通过类名.class
		Class class1 = Person.class;
		// 2、对象.getClass()
		Person p = new Person();
		Class class2 = p.getClass();
		// 3、Class.forName();
		Class class3 = Class.forName("com.imooc.reflect.test.Person");

	}
}



//测试constructor对象
public class ConstructorTest {
	@Test
	/*
	 * 获得无参的构造方法
	 */
	public void demo1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
	Class c1=	Class.forName("com.imooc.reflect.test.Person");
	Constructor con=c1.getConstructor();
	Person p=(Person)con.newInstance();//相当于Person person=new Person();
	p.eat();
		
	}
	@Test
	/*
	 * 获得有参的构造方法
	 */
	public void demo2() throws Exception{
		Class c2=Class.forName("com.imooc.reflect.test.Person");
		Constructor c=c2.getConstructor(String.class,String.class);
		Person p=(Person)c.newInstance("a","sd");//Person p=new Person("a","sd");
		System.out.println(p);
	}

}




//测试Field对象
public class FiledTest {
	@Test
	// 测试公有属性
	public void demo1() throws Exception{
		//获得class
		Class c=Class.forName("com.imooc.reflect.test.Person");
		//获得属性
		Field field=c.getField("name");
		//操作属性
		Person p=(Person)c.newInstance();
		field.set(p, "sss");//p.name="sss";
		Object obj=field.get(p);
		System.out.println(obj);
	}
	
	@Test
	//测试私有属性
	public void demo2() throws Exception, SecurityException{
		//获得class
		Class c2=Class.forName("com.imooc.reflect.test.Person");
		//获得私有属性
		Field field =c2.getDeclaredField("sex");
		//操作属性
		Person p=(Person)c2.newInstance();
		//私有属性需要设置一个可访问的权限
		field.setAccessible(true);
		field.set(p, "male");
		//获取值
		Object obj=field.get(p);
		System.out.println(obj);
		System.out.println(p);	
	}
}




//测试Method对象
public class MethodTest {
	@Test
	//测试公有方法
	public void demo1() throws Exception{
		Class class1=Class.forName("com.imooc.reflect.test.Person");
		//实例化
		Person p=(Person)class1.newInstance();
		
		Method method=class1.getMethod("eat");
		//执行该方法
		method.invoke(p);
		
	}
	@Test
	//测试私有方法
	public void demo2() throws  Exception{
		Class class1=Class.forName("com.imooc.reflect.test.Person");
		//实例化
		Person p=(Person)class1.newInstance();
		//获得该方法
		Method method=class1.getDeclaredMethod("run");
		//设置私有方法的访问权限
		method.setAccessible(true);
		//执行该方法
		method.invoke(p);
		
	}
	@Test
	//测试私有方法带参数
	public void demo3() throws Exception{
		Class class1=Class.forName("com.imooc.reflect.test.Person");
		//实例化
		Person p=(Person)class1.newInstance();
		//获得该方法
		Method method=class1.getDeclaredMethod("sayHello",String.class);
		//设置私有方法的访问权限
		method.setAccessible(true);
		//执行该方法
		Object obj=method.invoke(p, "jack");
		System.out.println(obj);				
	}
}


最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!
可及的小屋

发布了48 篇原创文章 · 获赞 9 · 访问量 2405

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/104378125
今日推荐