public class ReflectTest01 {
public static void main(String[] args) throws ClassNotFoundException {
//第一种方式
Class c1 = Class.forName("Employee");//c1引用保存地址指向堆中的对象,该对象代表的是Employee整个类
//第二种方式
//Java中每个类都有class属性
Class c2 = Employee.class;
//第三种方式
//java语言中任何一个java对象都有getClass 方法
Employee e = new 获得类的加载.Employee();
Class c3 = e.getClass();
//因为Employee这个类在jvm中只有一个,,所以c1,c2,c3 的内存地址是相同的,指向堆中唯一的一个对象
System.out.println(c1==c2);//双等号两边如果是跟引用数据类型 ---->比较的是内存地址
System.out.println(c2==c3);
//c4,c5,c6 都代表 date这个类
Class c4 = Date.class; //c4代表 Date这睿共享个类
Class c5 = Class.forName("java.lang.Date"); // 必须写类全名,类全名带有包名
Date d = ne睿共享w Date(0);
Class c6 = d.getClass();
}
}
class Employee {
//Field 字段
private String name;
//无参
public Employee() {}
//Constructor 构造函数
public Employee(String name) {
this.name = name;
}
//方法
public void work() {
System.out.println(name + "在工作");
}
}
---------------------------------睿共享-----------------------------------------------------------------------------------------------
新建一个实体类
//实体类
public class User {
private Integer id;//id
private String userCode;//用户编码
private String userName;//用户名称
private String userPassword;//用户密码
private int gerder;//性别
private Date birthday;//出生日期
private String phone;//电话
private String address;//地址
private Integer age;//年龄
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public voi睿共享d setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getGerder() {
return gerder;
}
public void setGerder(int gerder) {
this.gerder = gerder;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userCode='" + userCode + ''' +
", userName='" + userName + ''' +
", userPassword='" + userPassword + ''' +
", gerder=" + gerder +
", birthday=" + birthday +
", phone='" + phone + ''' +
", address='" + address + ''' +
", age=" + age +
'}';
}
public User(Integer id, String userCode, String userName) {
this.id = id;
this.userCode = userCode;
this.userName = userName;
}
public User() {
}
}
User user = new User();
//1反射创建对象第一种方法
Object o = c.newInstance();
//複製上去
User user1 = (User)o;
user1.setId(1);
user1.setUserCode("admin");
user1.setUserName("李四");
System.out.println(user1);
Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors){
System.out.println("constructor"+constructor);
}
//2反射创建对象第二种方法 //通过构造方法 通过class对象获取构造器 然后newInstance
Constructor constructor = c.getConstructor(Integer.class,String.class,String.class);
Object o1 = constructor.newInstance(1, "刘思", "admin");
if(o1 instanceof User){
User user2 = (User) o1;
System.out.println(user2);
}
------------------------------------------------------------------------------------------------------------------------------------
练习反射
public class ArticleTypeBean {
private int id = -1;
private String typeName = "";
private String typeInfo = "";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTypeInfo() {
return typeInfo;
}
public void setTypeInfo(String typeInfo) {
this.typeInfo = typeInfo;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
@Test
public void test() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c = Class.forName("com.rzk.valuebean.ArticleTypeBean");
//获得类的名字
System.out.println(c.getName());//获得包名和类名
System.out.println(c.getSimpleName());//获得类名
//获得类的属性
Field[] fields = c.getFields();//获得类的公开属性
fields = c.getDeclaredFields();//获得该类的全部属性
for (Field fs : fields){
System.out.println(fs);
}
//获得指定属性的值
System.out.println("----------华丽的分割线----------");
Field name = c.getDeclaredField("typeName");
System.out.println(name);
System.out.println("-------有是一条华丽的分割线-------");
//获得类的方法
Method[] methods = c.getMethods();//获得本类及其父类的全部public方法
for (Method m : methods){
System.out.println(m);
}
methods = c.getDeclaredMethods();//获得本类的所有方法
for (Method method : methods){
System.out.println("getDeclareMethods "+method);
}
//获得指定的方法 要赋值
Method typeName = c.getMethod("getTypeName");
Method setTypeName = c.getMethod("setTypeName",String.class);
System.out.println(typeName);
System.out.println(setTypeName);
System.out.println("-------有是一条华丽的分割线-------");
//获得指定的构造器
Constructor[] constructors = c.getConstructors();
for (Constructor constructor:constructors){
System.out.println(c);
}
constructors = c.getDeclaredConstructors();
for (Constructor constructor : constructors){
System.out.println(constructor);
}
System.out.println("-------有是一条华丽的分割线-------");
Constructor declaredConstructor = c.getDeclaredConstructor();
System.out.println("指定的构造器 = "+declar睿共享edConstructor);
}