| |目录
- 运行环境
- Java语言的反射机制
- Class中的常用方法(获得类的构造方法)
- Class中的常用方法(获得类的属性)
- Class中的常用方法(获得类的方法)
- 反射动态调用类的成员
1.运行环境
JDK8+lntellij IDEA 2018.3
2.Java 语言的反射机制
- Java 反射是Java语言的一个很重要的特征,它使得Java具有了“动态性”。
- Java提供了一套机制来动态获取类的信息以及动态调用对象的方法的功能,这套机制就叫——反射
- 反射机制是如今很多流行框架的实现基础,其中包括Struts、Spring、Hibernate等。
3.Class中的常用方法(获得类的构造方法)
- getConstructors():获得类的所有的public类型的构造方法。
- getDeclaredConstructors():获得类所有的构造方法
- getConstructor(Class[] parameterTypes):获得类的特定public的构造方法, parameterTypes 参数指定构造方法的参数类型。
- getDeclaredConstructor(Class[] parameterTypes):获得类指定的所有的构造方法
4.Class中的常用方法(获得类的属性)
- getFields():获得类的public类型的属性。
- getDeclaredFields():获得类本身的所有属性
- getField(String):获得指定名字的public类型的属性对象
- getDeclaredField(String)获得类自己的指定名字的属性对象
Field类:
- getModifiers():获得属性的修饰符(Modifier.toString(int)显示对应的修饰符类型)
- getType() : 获得属性的类型
5.Class中的常用方法(获得类的方法)
- getMethods():获得类的public类型的方法。
- getDeclaredMethods():获得类的所有方法。
- getMethod(String name, Class[] parameterTypes):获得类的特定public的方法, name参数指定方法的名字, parameterTypes 参数指定方法的参数类getDeclaredMethod(String name, Class[] parameterTypes)
Method类:
- getParameterTypes() :获得方法的所有参数类型
- getReturnType():获得方法的返回值类型
6.反射动态调用类的成员
调用方法步骤:
设定调用方法的参数列表(Class[])
获得调用方法的对象(Method)
设定调用方法的参数的值(Object[])
普通方法:invoke(obj,values);
构造方法:newInstance(values)
调用属性步骤:
根据属性名字获得属性对象(Field)
赋值:set(obj,value)
取值:get(obj) 如果需要强制访问类的私有成员,则需要设定: setAccessible(true);
Øjdbc.properties代码
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8 user=root password=
Ø/*jdbc读到内存中反射体验*/代码
public class DBUtil{ static Properties properties = new Properties(); private static String DRIVER; private static String URL; private static String USER; private static String PASSWORD; public static void main(String[] args) throws IOException { System.out.println("main:"+"hello"); Connection connection=DBUtil.getConnection(URL,USER,PASSWORD); } static { String path="jdbc.properties"; InputStream is= DBUtil.class.getClassLoader().getResourceAsStream(path); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } DRIVER= properties.getProperty("driver"); URL= properties.getProperty("url"); USER= properties.getProperty("user"); PASSWORD=properties.getProperty("password"); System.out.println("DRIVER:"+DRIVER+"URL:"+URL+""); try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } static Connection connection= null; public static Connection getConnection(String url,String user,String password){ try { connection= DriverManager.getConnection(url,user,password); System.out.println("connection:"+connection); } catch (SQLException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } return connection; } }
Ø三种获取类,代码
public class ReflectDemo1 { public static void main(String[] args) { Student student = new Student(); //1. object.getClass(); 引用类型, .getClass(),定义在Object对象 Class clzStu1=student.getClass(); //2. .class 适用于所有的数据类型 Class clzStu2=Student.class; //3. Class.forName(""); 先把类加载到内存中,得到类对象 Class clzStu3=null; try { clzStu3=Class.forName("com.javaboy.pojo.Student"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(clzStu1==clzStu2); System.out.println(clzStu2==clzStu3); System.out.println(clzStu1==clzStu3); } }
Ø效果图
Ø总结
Class是一个特殊的类,
它的实例用来表示一个.class文件在内存中的存在形势。
反射就是照镜子,照出类的内部结构。 利用反射,可以在运行状态下初始化类。
心得:
为什么要努力?
因为还有很多人毫不费力的过着我想要的生活
因为我对这个世界还有欲望,为了更自由,为了被尊重
为了不把世界让给我讨厌的人。
为了对得起未来的自己
如果你从此时此刻开始努力,最坏的结果,不过是大器晚成
今天是你余生中最年轻的一天,从今天去开始努力,即使暂时看不到希望
也要相信自己,相信明天你会感谢今天的努力。