什么叫类类?
反射实例化
反射方法调用
反射读写属性
什么叫类类?
1.类类的实例是猫类、狗类、学生类等等
2.类类的三种获取方式
2.1.Class.forName
2.2.类实例.getClass
2.3.类名.class
package com.zhulinjun; 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()); } }
package com.zhulinjun; public class demo1 { public static void main(String[] args) throws ClassNotFoundException { Student stu=new Student(); //第一种:Class.forName(java.lang.Class 类类,应用在jdbc连接数据库中) Class c1=Class.forName("com.zhulinjun.Student"); //System.out.println(c1);//加载进jvm中!调用无参构造方法创建了一个学生对象 class com.zhulinjun.Student //第二种,增删改 Class c2 = stu.getClass(); //System.out.println(c2); //第三种 Class c3=Student.class; System.out.println(c3); } }
反射实例化(所有实体类,添加了有参构造器,一定记得补一个无参构造器)
package com.zhulinjun; import java.lang.reflect.Constructor; public class demo2 { public static void main(String[] args) throws Exception { //一切反射从类类开始 Class c=Class.forName("com.zhulinjun.Student"); // 所有实体类,添加了有参构造器,一定记得补一个无参构造器 // 1.调用无参构造器反射实例化 Student s1 = (Student) c.newInstance(); System.out.println(s1);//加载进jvm中!调用无参构造方法创建了一个学生对象 com.zhulinjun.Student@7852e922 // 2.调用有一个参数构造器反射实例化 // parameterTypes:代表参数的类别,例如String.class Constructor cr1=c.getConstructor(String.class); Student s2 = (Student) cr1.newInstance("s001"); System.out.println(s2);//加载进jvm中!调用带一个参数的构造方法创建了一个学生对象 com.zhulinjun.Student@7852e922 // 3.调用有两个参数构造器反射实例化 Constructor cr2=c.getConstructor(String.class,String.class); Student s3 = (Student) cr2.newInstance("s002","nb"); System.out.println(s3);//加载进jvm中!调用带二个参数的构造方法创建了一个学生对象 com.zhulinjun.Student@7852e922 // 4.调用私有的带有一个参数的构造器实例化 // getConstructor方法只能获取到公有的构造器对象 Constructor cr3=c.getDeclaredConstructor(Integer.class); // Exception in thread "main" java.lang.IllegalAccessException: Class com.zhulinjun.demo2 can not access a member of class com.zhulinjun.Student with modifiers "private" //setAccessible:打开私有修饰符的访问权限 cr3.setAccessible(true); Student s4= (Student) cr3.newInstance(18); System.out.println(s4);//加载进jvm中!调用Student类私有的构造方法创建一个学生对象 com.zhulinjun.Student@5c647e05 } }
反射方法调用
package com.zhulinjun; import java.lang.reflect.Method; public class demo3 { public static void main(String[] args) throws Exception { Class c=Student.class; Student stu = (Student) c.newInstance(); // 1.反射调用无参方法,先获取到方法对象 // name:方法名 parameterTypes:调用这个方法要传的参数类型 Method m1=c.getMethod("hello"); // obj:类实例 args:参数值 invoke:方法的返回值 Object invoke = m1.invoke(stu); System.out.println(invoke);//你好!我是null // 2.反射调有参方法 Method m2=c.getMethod("hello", String.class); Object invoke2 = m2.invoke(stu, "大傻"); System.out.println(invoke2);//大傻你好!我是null // 3.调用有参的私有的方法 Method m3=c.getDeclaredMethod("add", Integer.class,Integer.class); m3.setAccessible(true); Object invoke3 = m3.invoke(stu, 1,2); System.out.println(invoke3);//3 } }
反射读写属性
package com.zhulinjun; import java.lang.reflect.Field; import javax.annotation.Generated; import org.omg.CORBA.Request; public class demo4 { public static void main(String[] args) throws Exception { Class clz=Student.class; Student stu=new Student("s001","nb"); stu.age=18; // 获取到该学生的stu的sid值以及sname值 System.out.println(stu.getSid());//s001 System.out.println(stu.getSname());//nb // 获取某一个对象的所有值(读) // field:属性对象 Field[] Fields = clz.getDeclaredFields(); for (Field f : Fields) { f.setAccessible(true); System.out.println(f.getName()+":"+f.get(stu));//sid:s001 sname:nb age:18 } // 修改值(写) Field nameFields = clz.getDeclaredField("sname"); nameFields.setAccessible(true); nameFields.set(stu, "zml"); System.out.println(nameFields.getName()+":"+nameFields.get(stu));//sname:nb age:18 sname:zml } }