20201018黄春跃
20201018黄春跃
知识点总结
反射
反射(reflect)是java的特征之一,反射机制是建造框架技术的基础所在,灵活掌握java反射机制,对以后学习框架技术将有很大的帮助。
java的反射机制是指在运行状态中,动态获取类的信息(类的属性和方法)以及动态调用对象方法的功能。
java反射有三个动态性质
1.运行时生成对象实例。
2.运行期间调用方法。
3.运行时更改属性。
获取Class
-
可以通过 对象.getClass() 获取 Class 对象
```java Student stu = new Student();
Class cla = stu.getClass();
System.out.println(cla);//class com.ycdl.itlaobing.Student
``` -
类名.class 获取 Class 对象
Class cla = Student.class;//通过类的class属性 System.out.println(cla);//class com.ycdl.itlaobing.Student
getName()
System.out.println(cla.getName());//class com.ycdl.itlaobing.Student
获取Class对象中的信息
获取构造方法
Class cla = Student.class;
try {
//返回此Class对象的public构造方法
//无参构造
Constructor con = cla.getConstructor();
System.out.println(con);//public com.ycdl.itlaobing.Student()
//有参构造
Constructor cons = cla.getConstructor(int.class,String.class,char.class);
System.out.println(cons);
//public com.ycdl.itlaobing.Student(int,java.lang.String,char)
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
方法
package com.ycdl.itlaobing;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class Demo003 {
public static void main(String[] args) {
Class cla = Student.class;
//获取所有public修饰的构造方法
Constructor[] cons = cla.getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);
}
System.out.println("======================");
Constructor c = cons[0];
System.out.println(c);
//class java.lang.reflect.Constructor
Class cla1 = c.getClass();
System.out.println(cla1);
// 获取访问修饰符 1 = public
int cla2 = c.getModifiers();
System.out.println(cla2);
//获取构造方法所在类的名字
System.out.println(c.getName());
//获取构造方法参数类型的个数
int cla3 = c.getParameterCount();
System.out.println(cla3);
//获取构造方法参数
Parameter[] cla4 = cons[1].getParameters();
for (Parameter parameter : cla4) {
System.out.println(parameter);
}
// 获取参数列表的类型
Class[] cla5 = cons[1].getParameterTypes();
for (Class class1 : cla5) { }
}
}
package com.ycdl.itlaobing;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class Demo004 {
public static void main(String[] args) {
Class cla = Student.class;
// 获取所有 public 修饰的构造方法
Constructor[] cons = cla.getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);
}
System.out.println("========================");
//获取所有的构造方法
Constructor[] cons1 = cla.getDeclaredConstructors();
for (Constructor constructor : cons1) {
System.out.println(constructor);
System.out.println(constructor.getModifiers());
}
System.out.println("========================");
//获取指定的构造方法
try {
Constructor<Student> c = cla.getDeclaredConstructor(int.class,String.class,char.class);
// System.out.println(c);
c.setAccessible(true);
Student stu = c.newInstance(1,"abc",'男');
System.out.println(c);
System.out.println(stu);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.ycdl.itlaobing;
import java.lang.reflect.Method;
public class Demo005 {
public static void main(String[] args) {
Class cla = Student.class;
try {
// 获取 public 修饰的方法, 包含继承但未重写的指定方法
Method m = cla.getMethod("eat", String.class);
System.out.println(m);
System.out.println("==========================");
//获取所有的public修饰的方法
Method[] method = cla.getMethods();
for (Method method2 : method) {
System.out.println(method2);
}
System.out.println("==========================");
//访问类中声明的方法
Method m1 = cla.getDeclaredMethod("test");
System.out.println(m1);
System.out.println("==========================");
//访问类中声明的所有方法
Method[] m2 = cla.getDeclaredMethods();
for (Method method2 : m2) {
System.out.println(method2);
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.ycdl.itlaobing;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Demo006 {
public static void main(String[] args) {
Class<Student> cla = Student.class;
try {
Method method = cla.getDeclaredMethod("study");
System.out.println(method);
// 访问修饰符 1 = public
int mo = method.getModifiers();
// 获取方法名字 toString
String name = method.getName();
// 获取方法的参数个数
int count = method.getParameterCount();
// 获取参数列表
Parameter[] ps = method.getParameters();
// 获取参数列表的类型
Class[] pts = method.getParameterTypes();
// 获取方法的返回值 如果没有返回值,此方法返回 void
Class re = method.getReturnType();
// 获取注解
Annotation[] ans = method.getAnnotations();
// 表示创建一个对象,调用无参构造
Student stu = cla.newInstance();
// 表示执行此方法,第一个参数表示执行方法的对象,第二个参数表示执行方法需要传的的参数
Object reValue = method.invoke(stu);
System.out.println(reValue);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
总结
今天不上晚自习,回宿舍复习前面的基础。
近期评论