总结 :
为什么要有Class类及反射 :Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、成员信息以及数组信息。
目前我就知道 这个是用来修改程序的 就是当程序发布的时候 方便快速的去网上下载程序的工具包 然后是编译不了的还是啥的 我也不懂 就是通过反射可以访问一些平时访问不到的东西 如私有变量也是可以访问的
简单总结一下
这里主要是以下几个类
Class Constructor Method Filed (类 构造方法 方法 成员变量)
后三个类都位于反射包下 继承自同一个类
Class类位于这里
接下来讲一下怎么去使用 :
首先要获取Class对象 有好几种方法 如下
算了 看书吧1 或看这里 https://blog.csdn.net/liu_c_y/article/details/51815279有说三种方法 我总结下吧
.class方法对于引用类型和基本类型都可以
getClass只能对象使用 及引用类型使用
重点哈 获取class 见这篇文章https://blog.csdn.net/qq_21808961/article/details/80381989 懒得打字了
然后这些事 Class类里的方法可以获取的信息
然后就利用那后三个类 构造方法类 方法类 成员变量类
通过 Class里的方法的返回值创建相应的类的对象 然后 后三个类里面也是有方法的哦 具体就不细说了 去查Api
就可以通过后三个类里面的方法进行一些操作与访问 同时也可以用Class类来数组配合
例子如下
package FanShe;
public class MoreCoustracter {
String name;
int id;
int age;
int height;
public MoreCoustracter() {
super();
// TODO 自动生成的构造函数存根
}
private MoreCoustracter(String name) {
super();
this.name = name;
}
public MoreCoustracter(String name, int id, int age, int height) {
super();
this.name = name;
this.id = id;
this.age = age;
this.height = height;
}
public MoreCoustracter(String name, int id, int age) {
super();
this.name = name;
this.id = id;
this.age = age;
}
public MoreCoustracter(String ...strings) {
if(strings.length>3){
id=Integer.valueOf(strings[0]);
}
}
public void print(){
System.out.println("测试Class类和Java反射");
}
}
package FanShe;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import javax.naming.directory.ModificationItem;
import javax.swing.OverlayLayout;
public class TestCoustractor {
public static void main(String[] args) {//1:class获取类对象 :2: 通过类对象获取构造方法的构造类对象 3:通过构造类对象使用构造方法中得到一些方法返回给Class对象里的数组
Class c=MoreCoustracter.class;
Constructor[] declaredConstructor=c.getDeclaredConstructors();
for(int i=0;i<declaredConstructor.length;i++){
Constructor h=declaredConstructor[i];
System.out.println("查看是否允许带有可变数量的参数:"+h.isVarArgs());
System.out.println("该构造方法的入口参数类型依次是:");
Class []parameterTypes=h.getParameterTypes();
for(int i1=0;i1<parameterTypes.length;i1++){
System.out.println(" "+parameterTypes[i1]);
}
System.out.println("该构造方法可能抛出的异常类型为:");
Class []exceptionTypes=h.getExceptionTypes();
for(int i1=0;i<exceptionTypes.length;i1++){
System.out.println(" "+exceptionTypes[i1]);
}
MoreCoustracter m=new MoreCoustracter();
while(m==null){
try {
if(i>1){
m=(MoreCoustracter)h.newInstance();
}else if(i==1){
m=(MoreCoustracter)h.newInstance("7",5);
}else{
Object[] paramenters=new Object[]{new String[]{"100","200","300"}};
m=(MoreCoustracter)h.newInstance(paramenters);
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
System.out.println("在创建对象时抛出异常,下面执行setAccessible方法");
h.setAccessible(true);//设为允许访问
// e.printStackTrace();
}
}
m.print();
System.out.println();
}
try {
Constructor t=c.getDeclaredConstructor(String.class);
Class[] paraments=t.getParameterTypes();
System.out.println(" "+paraments[0]);
int f=t.getModifiers();
System.out.println(Modifier.isPublic(f));
System.out.println(Modifier.toString(f));
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SecurityException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
v