public class Test2 {
public static void main(String[] args) throws ClassNotFoundException {
Class class1=Test2.class;//每个类都有class属性
Class class2=new Test02().getClass();//每个对象都有getClass()
Class class3=Class.forName("com.sky.homework.p11.Test2");
Class<?>class4=int.class;
Class<?>class5=Integer.class;
System.out.println(class4==class5);//false
Class<?>class6=Integer.TYPE;//TYPE返回的就是int基本类型
Class<?>class7=Class.forName("com.sky.homework.p11.Person");
//执行了静态代码块
}
}
class Person{
static{
System.out.println("执行了静态代码块");
}
}
import java.lang.reflect.Modifier;
public class Test3 {
public static void main(String[] args) {
//1)创建Class对象
Class<?>class1=String.class;
//创建String类class属性赋值给Class实例对象class1
//2)
//2.1修饰符
int mod=class1.getModifiers();
/*调用实例对象class1中的getModifiers()方法
getModifiers()方法类型是基本整数类型*/
String modifier=Modifier.toString(mod);
//调用Modifier类中的toString,将其里面的参数int类型转化成字符串类型
StringBuilder sb=new StringBuilder();
//创建可变长参数对象,以便调用append()添加方法
//2.2类名
sb.append("class\t");//class
sb.append(class1.getName());//java.lang.String,完整类名
sb.append("\t"+class1.getSimpleName()+"\t");//String,简易类名
//2.3父类
Class<?>superclass=class1.getSuperclass();
//得到class1属性的父类
sb.append("\t"+superclass.getSimpleName()+"\t");
//2.4接口
Class<?>[] interfaces = class1.getInterfaces();
if(interfaces.length>0){
for(int i=0;i<interfaces.length;i++){
sb.append("\t"+interfaces[i].getSimpleName()+"\t");
/*class1是String类型,String接口如下
Serializable Comparable CharSequence*/
}
}
System.out.println(sb);
}
}
import java.lang.reflect.Field;
/*1)反射对象名.getField(字段名); 返回指定字段名必须是公共类型的
2)反射对象名.getDeclaredField(字段名); 返回任意类型字段
如int age设置成private私有的,在进行设置时须:
反射对象名.setAccessible(true);才可以再进行反射返回任意类型字段 */
public class Test {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
Class<?>class1=Person1.class;
//创建Class反射类,将Person字节码文件赋值给class1
Field nameF = class1.getField("name");
//通过class1反射对象获取文件字段,然后赋值给Field类对象nameF
//通过反射技术创建对象(实例),默认调用类的无参构造
Object p1 = class1.newInstance();
//class1.newInstance();相当于p1
nameF.set(p1, "张三");
Field age = class1.getDeclaredField("age");
age.set(p1, 18);
System.out.println(p1);//姓名:张三, 年龄:18
}
}
class Person1{
public String name;//不加public报错
int age;
@Override
public String toString() {
return "姓名:" + name +", 年龄:" + age ;
}
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//通过反射机制调用字节码文件方法以及设置属性
public class Test4 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
Class<?>class1=Person2.class;
//1)将字节码文件反射给Class类
Object obj = class1.newInstance();
//2)将字节码文件通过newInstance创建新的对象
Method method = class1.getMethod("show", null);
//3)调用Class类getMethod()方法获得字节码文件show方法
Method set=class1.getMethod("set", String.class,int.class);
//4)通过Class类中的getMthod方法获取class字节码字段属性
set.invoke(obj, "张三",20);
//5)在新的对象中设置属性
method.invoke(obj);
//6)调用Method.invoke打印新的对象obj
}
}
class Person2{
public String name;
private int age;
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
public void set(String name, int age) {
this.age = age;
this.name = name;
}
}