1.反射是什么,有什么用?
反射---在程序运行的过程中,我们可以得到某个类的对象。可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。
当我们在没有见过某个类的情况下,仅凭一个完整的类名【包名+类名】,就可以获取到整个类的所有信息。
反射的使用场景:
1.jdkc加载数据库驱动
2.Serblet的web.xml配置
3.Spring框架
2.实例对象与反射对象的相互转换?
实例对象---就是我们通过类创建的对象
反射对象---通过反射机制得到的类对象
例如:反射就是以面经,镜子前面的你就是实例对象,通过镜子得到镜子里面的你就是反射对象。
反射对象是一个Class类型的对象
class---创建类的关键字
Class---类的类名,创建出来的Class类的对象就是反射对象。
public final class Class
1.通过实例对象的得到反射对象
1.通过实例对象的geiClass()得到,当前实例对象对应的反射对象
2.通过Class类的forname(类名【包名+类名】)
2.通过反射对象得到实例对象
反射对象的newInstance()方法,可以得到实例对象
例如:
package com.test3;
public class Student2 extends Person implements Myinter{
private int id;
private String name;
public Student2(int id,String name){
this.id=id;
this.name=name;
}
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;
}
}
package com.test3;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args) throws Exception {
//1.通过实例对象得到反射对象
//1.通过实例对象的getClass()得到,当前实例对象对应的反射对象
//Student stu1=new Student(); //实例对象
//Class stuclass1=stu1.getClass(); //反射对象
//2.通过Class类的forname(类名【包名+类名】)
//Class stuclass2=Class.forName("com.wangxing.test3.Student");
//2.通过反射对象得到实例对象[newInstance()]
Class stuclass=Class.forName("com.wangxing.test3.Student");
Student2 stu1=(Student2)stuclass.newInstance();
stu1.setId(1001);
stu1.setName("zhangsan");
//得到一个类的实例对象
//1.new
//2.静态方法
//3.反射
}
}
得到一个类的实例对象的反收割hi
1.new 2.静态方法 3.反射
3.通过反射对象得到类的完整结构
package com.test3;
public class Student extends Person implements Myinter{
private int id;
private String name;
public Student(){}
public String getinfo(String agrs1)throws Exception{
return "hello";
}
}
package com.test3;
public class Person {
}
package com.test3;
public interface Myinter {
}
package com.test3;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class TestMain2 {
public static void main(String[] args) throws Exception {
Class stu=Class.forName("com.test3.Student");
Package stupackage=stu.getPackage();
String stuupackage=stu.getName();
System.out.println(stupackage);
String classmodifier=Modifier.toString(stu.getModifiers());
String name=stu.getName();
name=getMyname(name);
System.out.println(name);
String supername=getMyname(stu.getSuperclass().getName());
System.out.println(supername);
String intername=getMyname(stu.getInterfaces()[0].getName());
System.out.println(intername);
System.out.println(classmodifier+"class "+name+" extdends "+supername+" implments "+intername+"{");
Field[] fileds=stu.getDeclaredFields();
for(Field filed:fileds){
String filedmod=Modifier.toString(filed.getModifiers());
String filedtype=getMyname(filed.getType().getName());
String filedname=filed.getName();
System.out.println("t"+filedmod+" "+filedtype+" "+filedname);
}
Constructor stuConstructor=stu.getConstructors()[0];
String stuconsmod=Modifier.toString(stuConstructor.getModifiers());
String stuConsname=getMyname(stuConstructor.getName());
System.out.println("t"+stuconsmod+" "+stuConsname+"(){}");
Method method=stu.getDeclaredMethods()[0];
String methodmod=Modifier.toString(method.getModifiers());
String methodreturn=getMyname(method.getReturnType().getName());
String methodname=method.getName();
String methodParme=getMyname(method.getParameterTypes()[0].getName());
String methodexce=getMyname(method.getExceptionTypes()[0].getName());
System.out.println("t"+methodmod+" "+methodreturn+" "+methodname+"("+methodParme+" args1)throws "+methodexce+"{");
System.out.println("tt return "hello";");
System.out.println("t}");
System.out.println("}");
}
private static String getMyname(String name) {
return name.substring(name.lastIndexOf(".")+1);
}
}
注解
注释---标注解释说明代码的含义用的文字
注解---标注结束说明功能的代码
1.@Override 判断方法重写是否正确
2.@SuppressWarnings 抑制警告信息。
有参数---产生警告的原因
位置:当前代码的上面 ,只抑制当前代码上的警告信息
方法代码的上面 ,只抑制当前方法中的同类型的警告信息
类的上面 ,只抑制当前类中的同类型的警告信息
@SuppressWarnings({ "unused", "rawtypes" })3. @Deprecated 标识变量/方法/类/接口,已过时。
已过时的元素尽量避免使用,因为有潜在的错误



