反射机制:
就是正在运行动态获取当前的类的所有信息。
类不用new,使用java的反射机制帮助去初始化,类私有属性可以使用反射机制去赋值
核心:获取当前类的class文件。
反射机制的作用:
提高程序的扩展性,封装一些工具类,写框架
如何禁止java的反射机制?
将类的构造函数私有化
应用场景:
SpringIoc,jdbc连接驱动,框架
创建一个User类:
package com.example.demo.fanshe;
/**
* @author:qsc
* @date: 2019/5/5
* @time: 15:03
* @Describe:
*/
public class User {
private String id;
private String name;
public User(){
System.out.println(" 无参构造函数使用反射机制创建对象");
}
public User(String id, String name) {
this.id = id;
this.name = name;
System.out.println("有参参构造函数使用反射机制创建对象");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
test:
package com.example.demo.fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @author:qsc
* @date: 2019/5/5
* @time: 15:03
* @Describe:
*/
public class test01 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//1通过new
// User user=new User();
//2通过反射,地址必须要写完整路径
Class<?> forName=Class.forName("com.example.demo.fanshe.User");
//通过默认无参构造函数创建对象,newInstance()就是使用java的反射机制创建对象
User user2= (User) forName.newInstance();
user2.setId("22");
System.out.println(user2);
//创建带有参的构造函数
Constructor<?> constructor=forName.getConstructor(String.class,String.class);
User user1= (User)constructor.newInstance("12","狗");
System.out.println(user1.toString());
}
}
jdbc:
public class DemoJDBC {
public static void main(String[] args) throws Exception {
// 加载驱动类
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取数据库连接
String url = "jdbc:mysql://192.168.1.1/test";
String user = "teamtalk";
String password = "123456";
Connection connection = (Connection) DriverManager.getConnection(
url, user, password);
PreparedStatement statement = (PreparedStatement) connection.prepareStatement(
"insert persion (name, age) value (?, ?)");
statement.setString(1, "hdu");
statement.setInt(2, 21);
statement.executeUpdate();
ResultSet resultSet = statement.executeQuery("select * from persion");
// 操作ResultSet结果集
while (resultSet.next()) {
// 第一种获取字段方式
System.out.println(resultSet.getString(1) + " " +
resultSet.getString(2) + " " + resultSet.getString(3));
}
// 关闭数据库连接
resultSet.close();
statement.close();
connection.close();
}
}
使用反射访问私有属性:
package com.example.demo.fanshe;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author:qsc
* @date: 2019/5/5
* @time: 15:25
* @Describe:
*/
public class test02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
//1.使用java的反射机制,获取类的所有属性方法,并且为私有属性赋值
Class<?> forName=Class.forName("com.example.demo.fanshe.User");
//2.获取当前类的所有属性
Field[] declardFields=forName.getDeclaredFields();
for(Field field:declardFields){
System.out.println(field.getName());
}
//3获取当前类的所有的方法
Method[] methods=forName.getDeclaredMethods();
for(Method method:methods){
System.out.println(method.getName());
}
//4使用java反射机制给私有属性赋值
Object newIntance=forName.newInstance();
Field id=forName.getDeclaredField("id");
//允许反射操作私有属性,不加上这条权限设置会报错
id.setAccessible(true);
id.set(newIntance,"20");
Field name=forName.getDeclaredField("name");
name.setAccessible(true);
name.set(newIntance,"狗");
User user= (User) newIntance;
System.out.println(user);
}
}
如果在xml中:
<beans>
<bean id="user1" class="com.itmayiedu.entity.UserEntity">
<property name="userId" value="1"></property>
<property name="userName" value="猫"></property>
</bean>
<bean id="user2" class="com.itmayiedu.entity.UserEntity">
<property name="userId" value="2"></property>
<property name="userName" value="狗"></property>
</bean>
</beans>
java代码:
//1.读取springxml配置
ClassPathXmlApplicationContext classPath = new
ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过Bean Id获取bean对象
User user = (User) classPath.getBean("user2");
System.out.println(user.getUserName());