通过Class的newInstance方法,完成对象的创建,newInstance方法会调用User类的无参构造方法,无参构造必须存在!如果没有这个无参数构造方法会出现"实例化"异常。
示例代码(1):
User类:
public class User {
public User() {
System.out.println("无参数构造方法");
}
}
测试类:
import ben.User;
public class ReflectText02 {
public static void main(String[] args) {
//不使用反射机制
User user = new User();
System.out.println(user);
//反射机制创建对象
try {
//通过反射机制获取Class,通过Class实例化对象
Class c = Class.forName("ben.User");//c代表User类型
//newInstance方法会调用User类的无参构造方法,完成对象的创建
Object obj = c.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
运行结果:
无参数构造方法
ben.User@10f87f48
无参数构造方法
ben.User@b4c966a
反射机制灵活性:可以做到不同对象的实例化,
资源绑定器:
java.util包下提供了一个资源绑定器,便于获取属性配置文件的内容,使用此方法时,属性文件必须在类路径下并且属性配置文件必须以.properties结尾。
示例代码:(2):
import java.util.ResourceBundle;
public class ResourceBundleText {
public static void main(String[] args) {
ResourceBundle bundle=ResourceBundle.getBundle("classinfo2");
String className=bundle.getString("className");
System.out.println(className);
}
}
属性配置文件内容:
运行结果:
ben.User
=======================================================================
Field类常用方法:
(1)类<?> getDeclaringClass() 返回表示的类或接口声明的 Field对象表示的领域 类对象。
(2)int getModifiers() 返回的 Field对象表示的场java语言修饰符为整数。
(3)String getName() 返回的 Field对象表示的字段的名称。
(4)类<?> getType() 返回一个 类对象标识声明类型的 Field对象表示的场。
(5)String toString() 返回一个描述这个 Field字符串。
反射Student类中的Field属性
示例代码(3):
Student类:
public class Student {
//Field:字段
public int id ;
private String name;
protected int age;
boolean sex;
public static final double MATH_PI=301415926;
}
测试类:
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectText05 {
public static void main(String[] args) {
try {
Class studenClass=Class.forName("ben.Student");
String className=studenClass.getName();
System.out.println("完整类型:"+className);
String simpleName=studenClass.getSimpleName();
System.out.println("简单类名:"+simpleName);
System.out.println("==============================");
//获取类中的Filed
Field[] fileds=studenClass.getFields();
System.out.println(fileds.length);//1
//取出这个Field
Field f=fileds[0];
String fieldName=f.getName();
System.out.println(fieldName);
//取出所有的Field
Field[] fs=studenClass.getDeclaredFields();
System.out.println(fs.length);//4
System.out.println("=========================");
for (Field field: fs){
//获取属性的修饰符列表
int i=field.getModifiers();
System.out.println(i);
String modfiersString= Modifier.toString(i);
System.out.println(modfiersString);
//获取属性的类型
Class fieldType=field.getType();
//String fNum=fieldType.getName();
String fNum=fieldType.getSimpleName();
System.out.println(fNum);
//获取属性名字
System.out.println(field.getName());
// System.out.println(field);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
运行结果:
完整类型:ben.Student
简单类名:Student
==============================
2
id
5
=========================
1
public
int
id
2
private
String
name
4
protected
int
age
0
boolean
sex
25
public static final
double
MATH_PI
反射机制进行反编译Student类 !!
示例代码(4):
import ben.Student;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/*
反射机制进行反编译!!
*/
public class ReflectText06 {
public static void main(String[] args) {
try {
StringBuilder s=new StringBuilder();
Class studentClass=Class.forName("ben.Student");
// Class studentClass=Class.forName("java.util.Date");
s.append(Modifier.toString(studentClass.getModifiers())+"\t"+"class"+"\t"+studentClass.getSimpleName()+"{\n");
Field[] fields=studentClass.getDeclaredFields();
for (Field field:fields){
s.append("\t");
s.append(Modifier.toString(field.getModifiers()));
s.append(" ");
s.append(field.getType().getSimpleName());
s.append(" ");
s.append(field.getName());
s.append(":\n");
}
s.append("}");
System.out.println(s);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
public class Student{
public int id:
private String name:
protected int age:
boolean sex:
public static final double MATH_PI:
}
================================================================================
给属性复制:set获取属性的值:get
示例代码(5):
Student类:
public class Student {
//Field:字段
public int id ;
private String name;
protected int age;
boolean sex;
public static final double MATH_PI=301415926;
}
测试类:
import java.lang.reflect.Field;
public class ReflectText07 {
public static void main(String[] args) {
try {
Class studentClass=Class.forName("ben.Student");
Object obj=studentClass.newInstance();//obj就是Student对象。(无参构造)
//获取no属性(根据属性的名称获取Field)
Field noField=studentClass.getDeclaredField("id");
//给obj对象的no属性赋值
noField.set(obj,2222 );//给no属性赋值2222
//读取值
System.out.println( noField.get(obj));
Field nameFiled=studentClass.getDeclaredField("name");
//打破封装,反射机制缺点
nameFiled.setAccessible(true);
//赋值
nameFiled.set(obj,"jack");
//获取
System.out.println(nameFiled.get(obj));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
# 最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
**目录:**
![全靠这套面试题,才让我有惊无险美团二面拿offer (面经解析)](https://img-blog.csdnimg.cn/img_convert/11d51236eb1e484eff6074a84b6f4cd8.webp?x-oss-process=image/format,png)
Java面试核心知识点
**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**
![全靠这套面试题,才让我有惊无险美团二面拿offer (面经解析)](https://img-blog.csdnimg.cn/img_convert/647ef0e169cc70f5afbe6ba11330c242.webp?x-oss-process=image/format,png)
Java面试核心知识点
**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**
![全靠这套面试题,才让我有惊无险美团二面拿offer (面经解析)](https://img-blog.csdnimg.cn/img_convert/c2a7626297cc3fa341353ecb92eb6142.webp?x-oss-process=image/format,png)
eption e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
# 最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
**目录:**
[外链图片转存中...(img-hVVxa4IT-1714313213600)]
Java面试核心知识点
**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**
[外链图片转存中...(img-d3jUyt9E-1714313213601)]
Java面试核心知识点
**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**
[外链图片转存中...(img-WVoUBXCN-1714313213601)]
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**