Java源码系列:下方连接 http://t.csdn.cn/Nwzed
前言
一、反射是什么?
package tanchishell.reflection;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectionSource {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.load(new FileInputStream("src\\re.properties"));
String classfullpath = (String) properties.get("classfullpath");
String methodName = (String)properties.get("method");
System.out.println(classfullpath +"===" +methodName);
//使用反射生成对象
Class<?> aClass = Class.forName(classfullpath);
//拿到class调用方法创建实例
Object o = aClass.newInstance();
//打印 o 的运行时类型
System.out.println("o的类型是==="+ o.getClass());
Cat cat = (Cat) o;
System.out.println(""+ cat);
//使用反射调用方法
Method method = aClass.getMethod(methodName);
method.invoke(cat);
//方法调用对象
System.out.println("======"+method);
}
}
Cat类
package tanchishell.reflection;
public class Cat {
private String name="招财狗";
// public Cat(String name) {
// this.name = name;
// }
public void hi(){
System.out.println("你好"+name);
}
public void hello(){
System.out.println("很不好"+name);
}
}
配置文件
classfullpath=tanchishell.reflection.Cat
method=hello
//更详细的代码
public class Cat {
private String name="招财狗";
public String catName="招财猫";
public Cat() {
}
public Cat(String name) {
this.name = name;
}
public Cat(String name,String catName) {
this.name = name;
this.catName = catName;
}
public void hi(){
System.out.println("你好"+name);
}
public void hello(){
System.out.println("很不好"+name);
}
}
//反射获取所有基本属性
package tanchishell.reflection;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectionSource {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.load(new FileInputStream("src\\re.properties"));
String classfullpath = (String) properties.get("classfullpath");
String methodName = (String)properties.get("method");
System.out.println(classfullpath +"===" +methodName);
//使用反射生成对象
Class<?> aClass = Class.forName(classfullpath);
//拿到class调用方法创建实例
Object object = aClass.newInstance();
//打印 o 的运行时类型
System.out.println("o的类型是==="+ object.getClass());
Cat cat = (Cat) object;
System.out.println(""+ cat);
//使用反射调用方法
Method method = aClass.getMethod(methodName);
method.invoke(cat);
//方法调用对象
System.out.println("方法调用对象======"+method);
//使用反射获取成员变量 getField不能获取私有属性和受保护的属性,只能获取public
Field cat1 = aClass.getField("catName");
cat1.get(object);//反射反过来调用方法。是方法调用对象
System.out.println("反射获取成员属性"+cat1);
//使用反射获取构造器,默认获取无参
Constructor<?> constructor = aClass.getConstructor();
System.out.println("默认获取无参"+constructor);
//获取有参
Constructor<?> stringConstructor = aClass.getConstructor(String.class);
System.out.println("获取有参"+stringConstructor);
//获取双参
Constructor<?> SSConstructor = aClass.getConstructor(String.class,String.class);
System.out.println("获取双参"+SSConstructor);
/**
* 获取构造器后还可以通过构造器创建对象
*/
}
}
二、反射机制的优化
三、Class类
同一个类只会通过类加载器加载一次,如果使用传统的 new 方式创建对象,在使用反射的方式就不会进行类加载了。
三、获取Class对象的六种方式
哪些类有Class对象
四、类的加载
动态和静态加载
类的加载流程
加载和连接阶段是由jvm虚拟机控制的,初始化程序员可以写在类中。
加载阶段
连接阶段
在准备阶段只是对成员变量进行默认初始化,而在初始化阶段才会对成员变量进行赋值。
初始化阶段
五、通过反射获取类的结构信息
六、反射爆破实例
反射暴力破解创建类的实例
package tanchishell.reflection;
import java.lang.reflect.Constructor;
/**
* 反射爆破对象
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception{
//1、先获取 User 类的 Class对象
Class<?> userClass = Class.forName("tanchishell.reflection.User");
//2、通过午餐狗杂创建实例
Object user = userClass.newInstance();
System.out.println(user);
//3、获取public有参构造创建实例
//获取有参构造器
Constructor<?> constructor = userClass.getConstructor(String.class);
Object hello = constructor.newInstance("hello");
System.out.println(hello);
//4、通过私有的有参构造创建实例
Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(int.class, String.class);
//爆破私有构造
declaredConstructor.setAccessible(true);
Object no = declaredConstructor.newInstance(20, "很不好");
System.out.println(no);
}
}
class User{
private int age = 10;
private String name = "你好";
public User() {
}
public User(String name) {
this.name = name;
}
private User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
反射爆破访问成员属性
文章来源:https://www.toymoban.com/news/detail-404473.html
package tanchishell.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/**
* 反射爆破对象
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception{
//1、先获取 User 类的 Class对象
Class<?> userClass = Class.forName("tanchishell.reflection.User");
//2、通过午餐狗杂创建实例
// Object user = userClass.newInstance();
//通过无参构造创建实例,并爆破
Constructor<?> constructor = userClass.getConstructor();
constructor.setAccessible(true);
Object user = constructor.newInstance();
System.out.println(user);
//2 通过反射获取属性
//获取所有public属性
Field[] fields = userClass.getFields();
for (int i = fields.length - 1; i >= 0; i--) {
Field field = fields[i];
field.setAccessible(true);
System.out.println(field);
field.set(user,60);
System.out.println(user);
}
//获取public属性,并赋值 调用这个方法属性必须是 public
Field age = userClass.getField("age");
age.setAccessible(true);
System.out.println(age);
age.set(user,100);
System.out.println(user);
//获取任意属性 但静态属性和私有属性不能赋值 IllegalAccessException 需要爆破
Field name = userClass.getDeclaredField("name");
name.setAccessible(true);
System.out.println(name);
name.set(user,"不是如风");
System.out.println(user);
//获取任意属性的值,也需要先进行爆破
System.out.println(name.get(user));
System.out.println(age.get(user));
}
}
class User{
public int age = 10;
private String name = "你好";
public User() {
}
public User(String name) {
this.name = name;
}
private User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
反射爆破访问方法
文章来源地址https://www.toymoban.com/news/detail-404473.html
package tanchishell.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射爆破对象
*/
public class ReflectionTest {
public static void main(String[] args) throws Exception{
//1、先获取 User 类的 Class对象
Class<?> userClass = Class.forName("tanchishell.reflection.User");
//2、通过午餐狗杂创建实例
// Object user = userClass.newInstance();
//通过无参构造创建实例,并爆破
Constructor<?> constructor = userClass.getConstructor();
constructor.setAccessible(true);
Object user = constructor.newInstance();
System.out.println(user);
//2 通过反射获取方法 getMethod("hi",String.class); 一定要注意
Method method = userClass.getMethod("hi",String.class);
method.invoke(user,"钢铁侠");
//3、通过反射获取任意方法 私有方法需要爆破
Method hello = userClass.getDeclaredMethod("hello", int.class,String.class);
hello.setAccessible(true);
hello.invoke(user,10,"钢铁侠");
}
}
class User{
public int age = 10;
private String name = "你好";
public void hi(String name){
System.out.println("你好!" +name);
}
private void hello(int age,String name){
System.out.println("你好!" +name+"我——" +age +"岁了");
}
public User() {
}
public User(String name) {
this.name = name;
}
private User(int age) {
this.age = age;
}
private User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
到了这里,关于反射全面详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!