小言_互联网的博客

Java反射---------通向高级的敲门砖

424人阅读  评论(0)

能点开这篇文章,相信你已经准备好了

那就让我们开始读代码吧,我会把对代码的理解写入注释中
这里我先解释一下什么是字节码对象:

字节码文件对象包含啥?

字节文件对象
构造方法 构造方法对象(类型Constructor)
成员变量 成员变量对象(类型Field)
成员方法 成员方法对象(类型Method)

不要问我为什么要读代码,我会告诉你,代码说的比我好,请仔细品尝,不懂的私信我或者百度,读代码开始,

package com.javase.reflect.demo1;

/*
 * 0. 在一次程序运行过程中,通过同一个类创建的对象得到的字节码文件对象是同一个
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Person p = new Person();
		Person p2 = new Person();
		
		//Object getClass()
		Class class1 = p.getClass();
		Class class2 = p2.getClass();
		System.out.println(class1);
		System.out.println(class2);
		System.out.println(class2 == class1);
		
		//类型.class
		//类型:引用数据类型 还可以是基本的数据类型
		Class class3 = Person.class;
		
		
		Class class4 = int.class;
		System.out.println(class3 );
		//Class.forName("类型名(大名)")
		try {
			Class class5 = Class.forName("com.javase.reflect.demo1.Person");
			System.out.println(class1 == class5);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

总共八个Java文件加一个文本文件
刚刚是第一个,接下来有大招,注意。。。

package com.javase.reflect.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {
	
	public static void main(String[] args) throws Exception {
		//读取配置文件中的类的信息
		FileReader f = new FileReader("aa.txt");
		BufferedReader br = new BufferedReader(f);
		String str = br.readLine();
		System.out.println(str);
		
		Person p = new Person();
		
		//用字节码文件对象来创建对象
		Class clazz = Class.forName(str);
		Constructor[] constructors = clazz.getConstructors();
		System.out.println(constructors.length);
		System.out.println(constructors[0]);
		System.out.println(constructors[1]);
		
		//用构造其对象来创建类的对象
		Constructor c =constructors[0];
//		System.out.println(c);
		Object obj = c.newInstance();
//		Person pp = (Person)obj;
//		pp.eat();
		System.out.println(obj);
	}
}

package com.javase.reflect.demo2;

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

/*
 * 
 * 2. 得到字节码中的成员变量对象
 */
public class Test3 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 1、得到成员变量对象
		Class clazz = Class.forName("com.javase.reflect.demo2.Person");
		//得到指定的Field Declared
		Field name = clazz.getDeclaredField("name");
		name.setAccessible(true);
		//传统的属性调用方式 对象.属性名 属性对象.set(对象 ,"value")
		Object obj = clazz.newInstance();
		name.set(obj, "张三");
		System.out.println(obj);
	}

}

package com.javase.reflect.demo2;

public class Person {

	//构造方法
	protected Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	Person(String name) {
		super();
		this.name = name;
	}
	private Person(int age) {
		super();
		this.age = age;
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void eat() {
		System.out.println("吃饭。。。。");
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	private String method(String namString) {
		System.out.println(namString);
		return "1231";
	}
	
}

package com.javase.reflect.demo1;

/*
 * 0. 在一次程序运行过程中,通过同一个类创建的对象得到的字节码文件对象是同一个
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Person p = new Person();
		Person p2 = new Person();
		
		//Object getClass()
		Class class1 = p.getClass();
		Class class2 = p2.getClass();
		System.out.println(class1);
		System.out.println(class2);
		System.out.println(class2 == class1);
		
		//类型.class
		//类型:引用数据类型 还可以是基本的数据类型
		Class class3 = Person.class;
		
		
		Class class4 = int.class;
		System.out.println(class3 );
		//Class.forName("类型名(大名)")
		try {
			Class class5 = Class.forName("com.javase.reflect.demo1.Person");
			System.out.println(class1 == class5);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

package com.javase.reflect.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {
	
	public static void main(String[] args) throws Exception {
		//读取配置文件中的类的信息
		FileReader f = new FileReader("aa.txt");
		BufferedReader br = new BufferedReader(f);
		String str = br.readLine();
		System.out.println(str);
		
		Person p = new Person();
		
		//用字节码文件对象来创建对象
		Class clazz = Class.forName(str);
		Constructor[] constructors = clazz.getConstructors();
		System.out.println(constructors.length);
		System.out.println(constructors[0]);
		System.out.println(constructors[1]);
		
		//用构造其对象来创建类的对象
		Constructor c =constructors[0];
//		System.out.println(c);
		Object obj = c.newInstance();
//		Person pp = (Person)obj;
//		pp.eat();
		System.out.println(obj);
	}
}

package com.javase.reflect.demo1;

public class Person {

	//构造方法
	public Person() {
		// TODO Auto-generated constructor stub
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void eat() {
		System.out.println("吃饭。。。。");
	}
	@Override
	public String toString() {
		return "Person22222222";
	}
	
}

package com.javase.reflect.demo1;

public class Person2 {

	//构造方法
	public Person2() {
		// TODO Auto-generated constructor stub
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public Person2(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void eat() {
		System.out.println("吃饭。。。。");
	}
	@Override
	public String toString() {
		return "Person22222222";
	}
}

学习感悟

作为一个架构师一定要有知识的广度和深度。

广度:你得知道有什么(比如你连apache的commons工具类们都不熟,还重复造轮子?还没人家造的好)

深度:你要知道选用重点技术的底层原理以及调优方案


转载:https://blog.csdn.net/weixin_44350891/article/details/104697866
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场