反射

反射

反射的概述
获得类对象的方式
实例化对象
动态调用方法
读写属性
访问修饰符
反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

反射的优点:增加程序的灵活性
反射的缺点:1性能第一 2安全限制 3内部暴露

获得类对象的方式

一切反射相关的代码都从获得类对象开始,先创建一个实体类

public class Student {
	private String sid;

	private String sname;
public Integer age;

static{
	System.out.println("加载进jvm中!");
}

public Student() {
	super();
	System.out.println("调用无参构造方法创建了一个学生对象");
}

public Student(String sid) {
	super();
	this.sid = sid;
	System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}

public Student(String sid, String sname) {
	super();
	this.sid = sid;
	this.sname = sname;
	System.out.println("调用带二个参数的构造方法创建了一个学生对象");
}

@SuppressWarnings("unused")
private Student(Integer age) {
	System.out.println("调用Student类私有的构造方法创建一个学生对象");
	this.age = age;
}

public String getSid() {
	return sid;
}

public void setSid(String sid) {
	this.sid = sid;
}

public String getSname() {
	return sname;
}

public void setSname(String sname) {
	this.sname = sname;
}

public void hello() {
	System.out.println("你好!我是" + this.sname);
}

public void hello(String name) {
	System.out.println(name + "你好!我是" + this.sname);
}

@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
	return new Integer(a.intValue() + b.intValue());
}

}在这里插入代码片

以下是获取类对象的几种方式
3种获取方式:
1 、类名.class;
2 、对象名.getClass();
3 、Class.forName(全限定名/全路径名);

 package com.zking.refle;
    
        /**
         * 获取类对象的方式
         * 		获取java。lang。class的一个类实例
 * 		-->对于本堂课而言,Student.class
 * 		1.通过对应类(java。lang。class)实例的类(Student.class)的getClass()方法获取
 * 			通用增删改的时候用到
 * 		2.通过Class。forNmae(“类的全路径”);JDBC的驱动加载就是用的反射技术
 * 		3.类实例.class
 * 			做通用查询的时候用到
 * 		
 * @author huguiyun
 *
 */

public class Demo2 {
	public static void main(String[] args) throws Exception {
//		Student stu = new Student();
//		Class clz = stu.getClass();方式一
		
//		Class clz = Class.forName("com.zking.refle.Student");方式二
		
//		Class clz = Student.class;方式三
//		System.out.println(clz);
	}
}

实例化对象

	Class clz = Student.class;
//		通过反射的方式调用无参构造器来实例化对象
//		Student stu = (Student) clz.newInstance();
		
//		通过反射的方式调用带有一个参数的构造器来实例化对象
//		Constructor c =  clz.getConstructor(String.class);
//		Student stu = (Student) c.newInstance("s001");
		
		
//		通过反射的方式调用带有两个参数的构造器来实例化对象
//		Constructor c =  clz.getConstructor(String.class,String.class);
//		Student stu = (Student) c.newInstance("s001","zs");
		
		
//		通过反射的方式调用带有私有的构造器来实例化对象
//		getConstructor与getDeclaredConstructor的区别
//		getConstructor获取是public 的
//		getDeclaredConstructor获取所欲的构造器
		Constructor c =  clz.getDeclaredConstructor(Integer.class);
		c.setAccessible(true);//使私有化的方法变得可用
		Student stu = (Student) c.newInstance(23);

动态调用方法

	Class<Student> clz=Student.class;
	
	//Method m = clz.getDeclaredMethod("hello");//无参方法
	//Object invoke = m.invoke(clz.newInstance());
	//System.out.println(invoke);
	
	//第一个参数指的是类类的类实例
	//第二个参数指的是调用方法携带的参数(没有参数就不填)
	//Method类的invoke方法的返回值就是被调用的方法的返回值
	//如果被调用的方法没有返回值,那么返回null
	
//		Method m = clz.getDeclaredMethod("hello",String.class);//有参方法
//		m.invoke(clz.newInstance(), "xxx");

	Method m = clz.getDeclaredMethod("add",Integer.class,Integer.class);//私有化方法
	m.setAccessible(true);
	Object invoke = m.invoke(clz.newInstance(), 10,5);
	System.out.println(invoke);

读写属性、

Student stu=new Student("s1","aa");
		stu.age=21;
		
		Class clz=stu.getClass();
		
		//获取属性值
//		Field[] fields = clz.getDeclaredFields();
//		for (Field field : fields) {
//			field.setAccessible(true);
//			System.out.println(field.getName()+":"+field.get(stu));
//		}
		
		//设置属性值  公有的
//		Field field = clz.getDeclaredField("age");
//		field.set(stu, 12);
//		System.out.println(stu.age);
		
		//设置私有的属性值
		Field field = clz.getDeclaredField("sname");
		field.setAccessible(true);
		field.set(stu, "bb");
		System.out.println(stu.getSname());

访问修饰符

JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。

其中,该修饰符是java.lang.reflect.Modifier的静态属性。

对应表如下:

PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048

int java.lang.reflect.Field.getModifiers()
以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符

boolean java.lang.reflect.Modifier.isPublic(int mod)
如果整数参数包括 public 修饰符,则返回 true,否则返回 false

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值