java反射案例,讲解分析

java反射

1,反射:

动态获取类的信息,以及动态调用对象的方法的属性、方法、接口、构造参数等。(可暴力破解类的私有信息)
①在运行时判断任意一个对象所属的类;

②在运行时构造任意一个类的对象;

③在运行时判断任意一个类所具有的成员变量和方法;

④在运行时调用任意一个对象的方法;

⑤生成动态代理。

java反射机制的功能强大随处可见,java.lang.reflect包中提供了对该功能的支持。

2.反射获取类的三种方法

//第一种:Class.forName(“包+类名”)   
Class cl=Class.forName("com.zhangzhi.Student");
//第二种,创建对象getClass()方法   实例对象.getClass();
Class c2=new Student.getClass();
//第三种方式,类名.class
new Student.class;

java反射主要的功能:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

具体的示例:


package com.zhangzhi.Myreflect;

public class Student implements Myinterface {
// 接口没用只是让演示一下获取
	
	private String name="4";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.out.println("来了老弟");
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + "]";
	}
	
}
package com.zhangzhi.Myreflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class InstanceTest2 {

	public static void main(String[] args) throws Exception {

//		三种获取类的方法
		
//		Class cl=Class.forName("com.zhangzhi.Student");  (“包+类名”)   
		
		//第二种,创建对象getClass()方法   实例对象.getClass();
//		Class c2=new Student.getClass();
		
		//第三种方式,类名.class
//		new Student.class;
		Student student = new Student();
		Class stuCls = Class.forName("com.zhangzhi.Myreflect.Student");
		


		Method method = stuCls.getDeclaredMethod("setName", String.class);
		method.setAccessible(true);//暴力破解方法
		
		
//		属性和方法都是带着Declared是所有的不带Declared是public
//		本人打一般喜欢Declared 下面在暴力破解
		Field field = stuCls.getDeclaredField("name");
		field.setAccessible(true);//暴力破解
		System.out.println(field.get(student));
//		以上是获取属性
		
		
		Student stu = (Student) stuCls.newInstance();
//		newInstance   是类对象
		method.invoke(stu, "你好兄弟");//invoke是传值
//		以上是方法
		
		
		Constructor cst2 = stuCls.getConstructor();
		Student obj2 = (Student) cst2.newInstance();
		System.out.println(obj2);
//		以上是构造

		Class[] interfaces = stuCls.getInterfaces();
		for (Class class1 : interfaces) {
			System.out.println(class1);
		}
//		以上是获取接口
		
		String name = stuCls.getName(); 
		Package package1 = stuCls.getPackage();
		Student mystu = (Student) stuCls.newInstance();
//		newInstance   是类对象上面有
		 System.out.println("全额限定名"+name+"bao名"+package1);
	}
}

这里提一下:setAccessible(true) 是暴力破解,可读取到private的方法和属性

发布了51 篇原创文章 · 获赞 172 · 访问量 2881

猜你喜欢

转载自blog.csdn.net/weixin_45519387/article/details/104010670