java基础核心技术学习笔记7--反射

1.why:

反射是学习java框架的基础。java框架的底层实现都是基于反射

2.Class:

1).Class是一个类型

2).当一个.class文件被加载到JVM是,在JVM内部会创建唯一的一个Class对象,它对应.class文件。

3)如何得到Class对象

1.1 最常用的方式 可以利用Class类的静态方法: forName(className)

String className = “lesson06.Person”;
clazz = Class.forName(className);

1.2如果已经存在对应的对象,则可以调用其getClass()方法

	Object obj = new Person();
	clazz = obj.getClass();
	System.out.println(clazz);

1.3也可以直接利用 类 的 class 静态属性:该种方式不会使静态代码块执行

	clazz = Person.class;
	System.out.println(clazz);

4).Class对象有什么作用:Class是反射的核心,一切反射都是从Class开始

①.如何获取全部的方法:调用了Class对象的getMethods()返回Method的数组

//获取全部的public方法。如果需要获取private方法,需要调用clazz.getDeclareMethods()
Method[] methods = clazz.getMethods(); 
for(Method method:methods){
 	System.out.println("--->" + method.getName()); 
 	}

②.获取指定的方法

//注意:需要备齐
//1).Class对象
//2).方法名setName()
//3).参数类型的列表:String.class

Method method = clazz.getMethod("setName", String.class);
System.out.println("**"+method );

③创建Class对应的对象:

//创建Class 对象对应的那个类的对象:调用Class对象的newInstance() 方法

Object object = clazz.newInstance();

//注意:必须要在Class对象所对应的那个类中提供一个共有的,无参数的构造器!否则运行就会出错!

5).如何使Method 方法执行

①.Method:在反射中对应方法

②.执行方法:调用对象的invoke()方法

//注意:需要备齐
//1).Method 对象 method
//2).Method 所在类的对象.object
//3).执行方法需要传入的参数 atguigu

method.invoke(object, "atguigu");

6).后面的内容:

①.操作属性。Field

②.如何操作 private 类型的成员(包括属性和方法)

③.反射和泛型

④.如何获取类的注解。

package lesson06;

public class Person {
	private String name;
	private int age;
	
	public Person(){
		System.out.println("Person's constructor...");
	}
	static{
		System.out.println("static block...");
	}
	
	public String getName(){
		return name;
	}
	public void setName(String name){
		System.out.println("setName: "+name);
		this.name = name;
	}
	
	public void setName(){
		
	}
	
	public int getAge(){
		return age;
	}
	public void setAge(int age){
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
}
package lesson06;

import java.lang.reflect.Method;

public class TestClass {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception, SecurityException {
		Class clazz = null;
		
		//1.得到Class对象
		//1.1 最常用的方式   可以利用Class类的静态放过: forName(className)
		String className = "lesson06.Person";
		clazz = Class.forName(className);
		
		//1.2如果已经存在对应的对象,则可以调用其getClass()方法
//		Object obj = new Person();
//		clazz = obj.getClass();
//		System.out.println(clazz);
//		
		//1.3也可以直接利用 类 的 class 静态属性:该种方式不会使静态代码块执行
//		clazz = Person.class;
		System.out.println(clazz);
		
		//2.得到Class对象能做什么?Class对象是反射的核心。
		//2.1创建Class 对象对应的那个类的对象:调用Class对象的newInstance() 方法
		//注意:必须要在Class对象所对应的那个类中提供一个共有的,无参数的构造器!否则运行就会出错!
		Object object = clazz.newInstance();
		System.out.println(object);
		
		//2.2得到Class对象所对应那个类中有哪些方法
		//注意:类中的方法对应在反射中对应的类是:Method
		Method[] methods= clazz.getMethods();
		for(Method method:methods){
			System.out.println("--->" + method.getName());
		}
		
		//2.3得到Class对象所对应的那个类的指定方法。
		//注意:需要备齐
		//1).Class对象
		//2).方法名setName()
		//3).参数类型的列表:String.class 
		Method method = clazz.getMethod("setName", String.class);
		System.out.println("**"+method );
		
		//2.4使方法执行:调用Method对象的invoke方法
		//注意:需要备齐
		//1).Method 对象 method
		//2).Method 所在类的对象. object
		//3).执行方法需要传入的参数 atguigu
		System.out.println();
		System.out.println(object);
		
		method.invoke(object, "atguigu");
		
		System.out.println(object);
		
		
		
//		Person person1 = new Person();
//		Person person2 = new Person();
//		Person person4 = new Person();
//		Person person3 = new Person();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值