Java反射机制
2020-12-13 02:04
标签:hello 出现 找不到 getname zhang dex 文件 imp extend 结果: 2、类名.class 结果: 3、类(Class类类的类对象) 实例.getClass() 通用增删改可用 结果: .反射的三大作用 结果1: 结果2: 结果3: 结果4: 出现错误1:java.lang.NoSuchMethodException , 说明你用的是getConstructor()方法,换成getDeclaredConstructor(); 出现错误2: java.lang.IllegalAccessException 没有设置私有可访问,加 .setAccessible(true); 结果: 赋值结果: 取值结果: .访问修饰符 getModifiers() 测试类信息: 测试代码: 输出结果: -->private -->private -->public Java反射机制 标签:hello 出现 找不到 getname zhang dex 文件 imp extend 原文地址:https://www.cnblogs.com/ly-0919/p/11025290.html .反射的概述
* 为什么jdbc连接要使用Class.forName("com.jdbc.mysql.Driver");
* 不管是mysql的驱动 Driver还是Oracle的驱动或者其他驱动;
* 它都需要去实现jdbc的一个驱动接口;
* com.jdbc.mysql.Driver extends java.sql.Driver
* java.sql.Driver d= Class.forName("com.jdbc.mysql.Driver")
*
* 例:
*
1 Class.forName(完整类名) jdbc、自定义mvc框架用到
2 类名.class 可用作通用的查询
3 对象.getClass() 通用增删改可用
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个
package com.yuan.reflect;
public class Student {
private String sid;
private String sname;
public Integer age;
static{
System.out.println("加载进jvm中!");
}
public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
}
public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用两个参数的构造方法创建了一个学生对象");
}
@SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建了一个学生对象");
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public void hello() {
System.out.println("你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + "]";
}
}
Class clz = Class.forName("com.yuan.reflect.Student");
System.out.println(clz);
class com.yuan.reflect.Student
Class clz=Student.class;
System.out.println(clz);
class com.yuan.reflect.Student
Student stu=new Student();
Class clz = stu.getClass();
System.out.println(clz);
class com.yuan.reflect.Student
package com.yuan.reflect;
import java.lang.reflect.Constructor;
/**
* 反射实例化
* 1.能够实例化未知的类
* 2.能够通过私有的构造器创建实例
* @author ***
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class clz= Student.class;
//1、反射调用无参构造方法创建了一个学生对象
// Student stu=(Student)clz.newInstance();
//2、调用一个有参构造方法创建一个学生对象
//拿到构造器类
// Constructor con = clz.getConstructor(String.class);//返回一个构造器
// //通过构造器实例化对象
// Student stu = (Student)con.newInstance("s007");
// System.out.println(stu);
//3、调用两个有参构造方法创建一个学生对象
//拿到构造器类
// Constructor con = clz.getConstructor(String.class,String.class);//返回一个构造器
// //通过构造器实例化对象
// Student stu = (Student)con.newInstance("s007","zhangsna");
//System.out.println(stu);
//4、调用Student类私有的构造方法创建了一个学生对象
//#java.lang.NoSuchMethodException: 未找到该方法(因为方法私有化所以不可被调用)
//# getConstructor 这个方法只能寻找到public(公开的)修饰的构造器
// Constructor con = clz.getConstructor(Integer.class);
//# getDeclaredConstructor 此方法可以寻找到任何修饰符修饰的构造器
// Constructor con = clz.getDeclaredConstructor(Integer.class);
//# 设置私有方法可被访问
// con.setAccessible(true);
// //通过构造器实例化对象
// Student stu = (Student)con.newInstance(17);
//System.out.println(stu);
}
}
public static void main(String[] args) throws Exception {
Student stu=new Student();
//stu.hello();//普通调用方法
Class clz=stu.getClass();
//调用无参方法
// Method m = clz.getDeclaredMethod("hello");
// m.invoke(stu);
//调用带参方法
Method m = clz.getDeclaredMethod("add",Integer.class,Integer.class);
m.setAccessible(true);
//invoke 如果反射动态调用的方法是被void所修饰,他返回的就是null
// 如果反射动态调用的方法不是被void所修饰,那么返回的就是被调用的方法的返回值
Object o=m.invoke(stu,20,5);
System.out.println(o);
}
package com.yuan.reflect;
import java.lang.reflect.Field;
/**
* 反射属性赋值取值
*
* 反射能将jsp传递过来的参数直接封装到实体类中
*
* @author ***
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
Student stu=new Student("s008","lili");
// stu.setSid("s004");
stu.age=22;
// System.out.println(stu);
// 赋值
//反射处理的是一类的问题,在处理多个属性赋值或取值的时候,使用反射可以减省很多代码
//处理私有(private)属性时 需要设置它为可被访问: setAccessible(true);
Class clz=stu.getClass();
Field field = clz.getDeclaredField("sid");//被赋值的属性
field.setAccessible(true);//设置私有可被访问
field.set(stu, "s02");//属性赋值
System.out.println(stu);
System.out.println(field.get(stu));
//取值
// Field[] fields = clz.getDeclaredFields();
// for (Field field : fields) {
// field.setAccessible(true);
// System.out.println(field.getName()+"--"+field.get(stu));
// }
}
}加载进jvm中!
调用两个参数的构造方法创建了一个学生对象
Student [sid=s02, sname=lili, age=22]
s02
加载进jvm中!
调用两个参数的构造方法创建了一个学生对象
sid--s008
sname--lili
age--22
public class Student {
private String sid;
private String sname;
public Integer age;
}
public static void main(String[] args) {
Class clz=Student.class;
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
System.out.println("-->");
System.out.println(Modifier.toString(field.getModifiers()));
}
}
上一篇:HTML学习笔记05