package com.yanshu.fanshe;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.alibaba.fastjson.JSON;
import com.yanshu.pojo.Person;
public class Fanshe1 {
/**
* 利用反射简单的调用属性和方法
* @throws Exception
*/
public static void FiledAndMethod() throws Exception{
Class clazz = Person.class;
// 1.创建clazz对应的运行时类Person类
Person p = (Person) clazz.newInstance();
System.out.println(p);
// 2.通过反射调用运行时类的字段的属性
/*
* Field f1=clazz.getField("name"); f1.set(p, "张三丰");
* System.out.println(p);
*/
// 2.1
Field f2 = clazz.getDeclaredField("name");
f2.setAccessible(true);
f2.set(p, "20");
System.out.println(p);
// 3.通过反射调用方法
Method m1 = clazz.getMethod("show");
m1.invoke(p);
Method m2 = clazz.getMethod("address", String.class);
m2.invoke(p, "河南");
}
/**
* java.lang.Class:是反射的源头
* 通过反射可以调用:属性 方法 构造器
* 正常的方法:引入需要的包类名称,通过new实例化,取得实例对象
* 反射是方法:1.实例化对象,2.getClass()方法,3得到完整的包名
*
* 反射的原理:
* 1.每一个运行时类只加载一次
* 2.有Class的实例化后,可以进行哪些操作
* 1).创建对应的运行时类的对象
* 2).获取对应的运行时类的完整结构(属性,方法,构造器,内部类,父类,所在的包,异常,注解)
* 3).调用对应的运行时类的指定的结构(属性,方法,构造器)
* 4).反射的应用,动态代理
* @throws Exception
*/
public static void clazz() throws Exception
{
//如何获取Class的实例(3种)
//1.调用运行时类本身的.class属性
Class clazz1=Person.class;
System.out.println(clazz1.getName());
Class clazz2=String.class;
System.out.println(clazz2.getName());
Class clazz3=Integer.class;
System.out.println(clazz3.getName());
//2.通过运行时类的对象获取
Person p=new Person();
Class clazz4=p.getClass();
System.out.println(clazz4.getName());
//3.通过Class的静态方法获取
String className="com.yanshu.pojo.Person";
Class clazz5=Class.forName(className);
System.out.println(clazz5);
}
public static void main(String[] args) throws Exception {
clazz();
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.alibaba.fastjson.JSON;
import com.yanshu.pojo.Person;
public class Fanshe1 {
/**
* 利用反射简单的调用属性和方法
* @throws Exception
*/
public static void FiledAndMethod() throws Exception{
Class clazz = Person.class;
// 1.创建clazz对应的运行时类Person类
Person p = (Person) clazz.newInstance();
System.out.println(p);
// 2.通过反射调用运行时类的字段的属性
/*
* Field f1=clazz.getField("name"); f1.set(p, "张三丰");
* System.out.println(p);
*/
// 2.1
Field f2 = clazz.getDeclaredField("name");
f2.setAccessible(true);
f2.set(p, "20");
System.out.println(p);
// 3.通过反射调用方法
Method m1 = clazz.getMethod("show");
m1.invoke(p);
Method m2 = clazz.getMethod("address", String.class);
m2.invoke(p, "河南");
}
/**
* java.lang.Class:是反射的源头
* 通过反射可以调用:属性 方法 构造器
* 正常的方法:引入需要的包类名称,通过new实例化,取得实例对象
* 反射是方法:1.实例化对象,2.getClass()方法,3得到完整的包名
*
* 反射的原理:
* 1.每一个运行时类只加载一次
* 2.有Class的实例化后,可以进行哪些操作
* 1).创建对应的运行时类的对象
* 2).获取对应的运行时类的完整结构(属性,方法,构造器,内部类,父类,所在的包,异常,注解)
* 3).调用对应的运行时类的指定的结构(属性,方法,构造器)
* 4).反射的应用,动态代理
* @throws Exception
*/
public static void clazz() throws Exception
{
//如何获取Class的实例(3种)
//1.调用运行时类本身的.class属性
Class clazz1=Person.class;
System.out.println(clazz1.getName());
Class clazz2=String.class;
System.out.println(clazz2.getName());
Class clazz3=Integer.class;
System.out.println(clazz3.getName());
//2.通过运行时类的对象获取
Person p=new Person();
Class clazz4=p.getClass();
System.out.println(clazz4.getName());
//3.通过Class的静态方法获取
String className="com.yanshu.pojo.Person";
Class clazz5=Class.forName(className);
System.out.println(clazz5);
}
public static void main(String[] args) throws Exception {
clazz();
}
}