14点
package com.shsxt.ref01;
public abstract class Person{
private int id;
private String name;
private int age;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public abstract void work();
}
package com.shsxt.ref01;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
/*
-
反射
-
1.创建对象的时候,拿到的都是当天前类型Class对象的一个镜像|赋值体
-
2.在类加载的时候,会在内存中存在当天前类型的一个Class对象,一个类的Class对象中存储这个类的所有信息(属性,方法,构造器…)
-
3.只要我们能够获取这个类型的Class对象,就可以对这个类做一切操作
-
Class 类的实例表示正在运行的 Java 应用程序中的类和接口
-
获取源头(Class对象):
-
1.对象.getClass()
-
2.类名.class
-
3.Class.forName(“类的权限命名:包名+类名”)
*/
public class ReflectDemo02 {
public static void main(String[] args) throws ClassNotFoundException{
//1.对象.getClass()
Class cls1=“哈哈”.getClass();
Class cls2=“呵呵”.getClass();
System.out.println(cls1==cls2);//2.类名.class Class cls3=String.class; System.out.println(cls1==cls3); System.out.println(cls3); //3.Class.forName("类的权限命名:包名+类名") 推荐 Class cls4=Class.forName("java.lang.String"); System.out.println(cls3==cls4); //4.根据子类的Class对象获取父类的Class对象 Class cls5=cls4.getSuperclass(); System.out.println(cls5); //5.获取基本数据类型的Class对象 Class base1=int.class; System.out.println(base1); Class cls6=Integer.class; System.out.println(base1==cls6); Class base2=Integer.TYPE; //得到对应的基本数据类型的class对象 System.out.println(base1==base2); //常用的方法 //1.getName() 包名+类名 System.out.println(cls5.getName()); //2. Class<?>[] getInterfaces() Class[] arr=cls4.getInterfaces(); System.out.println(Arrays.toString(arr)); //3.String getSimpleName() System.out.println(cls4.getSimpleName()); //4.boolean isInterface() isPrimitive() System.out.println(Integer.class.isPrimitive()); System.out.println(Integer.TYPE.isPrimitive());
}
}
- 根据子类对象获取父类的Class对象。
Class cc=cls4.getSuperclass()
Class cc=cls4.getSuperclass();
package com.shsxt.ref01;
import java.io.IOException;
import java.util.Properties;
/*
- 反射是发生在程序运行期间的行为–java的一个动静态机制 反射
*/
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
Properties pro=new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(“db.properties”));
Person p=(Person) Class.forName(pro.getProperty(“name”)).newInstance();
p.work();
}
}
class Teacher extends Person{
@Override
public void work() {
System.out.println("讲javase");
}
}
class Student extends Person{
@Override
public void work() {
System.out.println("javaee开发");
}
}
–但是JAVA有一定的动态性,我们可以利用反射机制、 字节码操作获得类似动态语言的特性。
– 动态语言 – 程序运行时,可以改变程序结构或变量类型。典型的
16点
package com.shsxt.ref01;
public class Person{
private int id;
private String name;
private int age;
public Person() {
// TODO Auto-generated constructor stub
}
Person(int id) {
this.id = id;
}
private Person(int id,String name) {
this.id = id;
this.name=name;
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
System.out.println("hhhhh");
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public static void haha(){
System.out.println("哈哈哈哈");
}
}
package com.shsxt.ref01;
import java.io.IOException;
import java.util.Properties;
/*
- 反射是发生在程序运行期间的行为–java的一个动静态机制 反射
*/
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
Properties pro=new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(“db.properties”));
Person p=(Person) Class.forName(pro.getProperty(“name”)).newInstance();
// p.work();
}
}
class Teacher extends Person{
/*@Override
public void work() {
System.out.println("讲javase");
}*/
}
class Student extends Person{
/*@Override
public void work() {
System.out.println("javaee开发");
}*/
}
package com.shsxt.ref01;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
/*
-
反射
-
1.创建对象的时候,拿到的都是当天前类型Class对象的一个镜像|赋值体
-
2.在类加载的时候,会在内存中存在当天前类型的一个Class对象,一个类的Class对象中存储这个类的所有信息(属性,方法,构造器…)
-
3.只要我们能够获取这个类型的Class对象,就可以对这个类做一切操作
-
Class 类的实例表示正在运行的 Java 应用程序中的类和接口
-
获取源头(Class对象):
-
1.对象.getClass()
-
2.类名.class
-
3.Class.forName(“类的权限命名:包名+类名”)
*/
public class ReflectDemo02 {
public static void main(String[] args) throws ClassNotFoundException{
//1.对象.getClass()
Class cls1=“哈哈”.getClass();
Class cls2=“呵呵”.getClass();
System.out.println(cls1==cls2);//2.类名.class Class cls3=String.class; System.out.println(cls1==cls3); System.out.println(cls3); //3.Class.forName("类的权限命名:包名+类名") 推荐 Class cls4=Class.forName("java.lang.String"); System.out.println(cls3==cls4); //4.根据子类的Class对象获取父类的Class对象 Class cls5=cls4.getSuperclass(); System.out.println(cls5); //5.获取基本数据类型的Class对象 Class base1=int.class; System.out.println(base1); Class cls6=Integer.class; System.out.println(base1==cls6); Class base2=Integer.TYPE; //得到对应的基本数据类型的class对象 System.out.println(base1==base2); //常用的方法 //1.getName() 包名+类名 System.out.println(cls5.getName()); //2. Class<?>[] getInterfaces() Class[] arr=cls4.getInterfaces(); System.out.println(Arrays.toString(arr)); //3.String getSimpleName() System.out.println(cls4.getSimpleName()); //4.boolean isInterface() isPrimitive() System.out.println(Integer.class.isPrimitive()); System.out.println(Integer.TYPE.isPrimitive());
}
}
package com.shsxt.ref01;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
/*
- 1.通过反射创建对象
- 1)通过反射获取到类中的构造器
- 2)根据构造器创建对象
-
构造器Constructor对象.newInstance(实参)方法
-
直接通过class类的newIntance()方法创建对象,方法没有参数 调用空构造
*/
public class ReflectDemo03 {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//1.先获取类的Class
Class cls=Person.class;
//2.通过Class类中的方法,获取到Person类中的构造器
/*
* Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
*/
Constructor con1=cls.getConstructor(int.class,String.class,int.class);
Person p=(Person) con1.newInstance(01,"卢妹妹",18);
System.out.println(p);
Person p1=(Person)cls.newInstance();
System.out.println(p1);
/*
* Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
*/
Constructor<Person>[] cons=cls.getDeclaredConstructors();
System.out.println(Arrays.toString(cons));
//私有的构造器
//放开权限
cons[1].setAccessible(true); //权限方法
Person p3=cons[1].newInstance(02,"卢双双");
cons[1].setAccessible(false);
System.out.println(p3);
}
}
package com.shsxt.ref01;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
public class ReflectDemo04 {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
// testField(Person.class);
testMethod(Person.class);
}
/*
* 操作方法 调用方法,能给方法传递实参
*
* Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods()
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
*/
public static void testMethod(Class cls) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
Method[] arr=cls.getMethods();
Person p=(Person) cls.newInstance();
// Method me=cls.getDeclaredMethod(“setAge”, int.class);
Method me=cls.getDeclaredMethod(“toString”);
System.out.println(me.invoke§);;
System.out.println(p.getAge());
// System.out.println(Arrays.toString(arr));
//静态方法执行的时候,invoke第一个参数可以为null
cls.getMethod(“haha”).invoke(null);
}
/*
* 反射操作类中的字段 能设置值 能获取值
* Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
*/
public static void testField(Class cls) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field name=cls.getDeclaredField("name");
//Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
name.setAccessible(true);
//void set(Object obj, Object value)
Person p=new Person(05,"大力",18);
name.set(p, "大力水手");
System.out.println(name.get(p));
System.out.println(name.getName());
System.out.println(Modifier.toString(name.getModifiers()));
}
}