简单的反射(代码)

这篇博客详细介绍了Java中的反射机制,包括如何通过Class对象获取类模板并创建实例,使用构造器创建对象,调用方法以及访问和修改私有属性。通过实例展示了getConstructor(), getDeclaredMethods(), setAccessible()等关键API的用法。" 50273875,1312512,JSON序列化:忽略异常属性与设置默认值,"['json', '序列化', 'C#']
//反射--类模版


//一个项目中一个类会加载几次?
//--当一个类被加载后会在内容中生成一个Class对象(类模版)
public class Learn1 {
private String name;
public int age;

private boolean flag;

public Learn1() {
System.out.println("呵呵");
}
public Learn1(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Learn1 [name=" + name + ", age=" + age + "]";
}
public boolean getFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}

private void use1(String s,int age) {
System.out.println("测试"+s+age);
}
void use2() {
System.out.println("测试");
}

protected void use3() {
System.out.println("测试");
}
public void use4(String s) {
System.out.println("测试"+s);
}

}

public class Test {
public static void main(String[] args) {


// 如何获得某一个类在内存中的Class对象?
// 第一种获得类模版的方式:
// try {
// Class<?> c = Class.forName("com.lovo.javaoo25.learn.Learn1");
// System.out.println(c);
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }


// 第二种获得类模版的方式:
// Learn1 l = new Learn1();
// Class<?> c = l.getClass();
// System.out.println(c);


// 第三种获得类模版的方式:
// Class<Learn1> c = Learn1.class;
// Class<?> c = Learn1.class;
// System.out.println(c);


// 使用Class对象创建该类对象
// Class<Learn1> c = Learn1.class;//获取Class对象
// try {
// //根据Class对象创建Learn1的对象
// Learn1 l = c.newInstance();
// System.out.println(l);
// } catch (InstantiationException | IllegalAccessException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }


// 使用类模版得到构造器来创建对象--无参构造
// Class<Learn1> c = Learn1.class;//获取Class对象
// try {
// //获取该类模版中的无参构造器
// Constructor<Learn1> con = c.getConstructor();
// //con通过newInstance()创建一个Learn1的对象--调用了构造器
// //是哪个构造器呢?
// //关键是c.getConstructor()中的参数
//
// //注意:con.newInstance()其参数应该和c.getConstructor()参数对应
// Learn1 l = con.newInstance();
//
// System.out.println(l);
//
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// 使用类模版得到构造器来创建对象--有参构造
// Class<Learn1> c = Learn1.class;//获取Class对象
// try {
// //获取该类模版中的指定参数Class对象的有参构造器
// Constructor<Learn1> con = c.getConstructor(String.class,int.class);
// //con通过newInstance(参数)创建一个Learn1的对象--调用了构造器
// //是哪个构造器呢?
// //关键是c.getConstructor(String.class,int.class)中的参数
// //--上面表明是第一个为String类型,第二个为int类型的有参构造器
//
// //注意:con.newInstance()其参数应该和c.getConstructor()参数对应
// Learn1 l = con.newInstance("张三",18);
//
// System.out.println(l);
//
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }


// 通过反射操作方法
// Class<Learn1> c = Learn1.class;//获取Class对象
// 得到所有的方法--得到公共的方法(包括父类的)
// Method[] m = c.getMethods();
// for (Method method : m) {
// System.out.println(method);
// }


// 得到方法--得到本类中声明的方法(重写的)
// Method[] m = c.getDeclaredMethods();
// for (Method method : m) {
// System.out.println(method);
// }


// 通过反射掉用方法--调用公共方法
// Class<Learn1> c = Learn1.class;//获取Class对象
// try {
// Learn1 l = c.newInstance();//创建一个对象
// Method m = c.getDeclaredMethod("use4", String.class);
//
// m.invoke(l,"小明");
// } catch (Exception e) {
// e.printStackTrace();
// }


// 通过反射掉用方法--调用有访问权限要求的方法--private等
// Class<Learn1> c = Learn1.class;// 获取Class对象
// try {
// Learn1 l = c.newInstance();// 创建一个对象
// Method m = c.getDeclaredMethod("use1", new Class[] { String.class, int.class });
//
// m.setAccessible(true);// 将访问权限解除
//
// m.invoke(l, new Object[] { "小明", 18 });
// } catch (Exception e) {
// e.printStackTrace();
// }


//获得属性
// Class<Learn1> c = Learn1.class;// 获取Class对象
// try {
// Field f = c.getDeclaredField("name");
// System.out.println(f);
// } catch (NoSuchFieldException e) {
// e.printStackTrace();
// } catch (SecurityException e) {
// e.printStackTrace();
// }


//得到私有属性,并修改值
// Learn1 l = new Learn1("小明", 18);
// Class<?> l1 = l.getClass();
//
// try {
// Field f = l1.getDeclaredField("name");
//
// f.setAccessible(true);
// f.set(l, "小刚");
//
// System.out.println(l);
//
// } catch (Exception e) {
// e.printStackTrace();
//

}


}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值