能点开这篇文章,相信你已经准备好了
那就让我们开始读代码吧,我会把对代码的理解写入注释中
这里我先解释一下什么是字节码对象:
字节码文件对象包含啥?
类 | 字节文件对象 |
---|---|
构造方法 | 构造方法对象(类型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
查看评论