java反射 interface_Java反射的基本应用

反射机制,程序在运行时加载新的类,使程序更加灵活

public classHelooReflect {public static voidmain(String[] args) {//获取类

testClass();

}private static voidtestClass() {//创建一个学生类的对象

Student student = newStudent();try{//开始获取类

Class clazz1 = Student.class;

Class clazz2=student.getClass();

Class clazz3= Class.forName("com.bjsxt.java.clc.fanshe.Student");//判断类对象是否相等

System.out.println(clazz1 ==clazz2);

System.out.println(clazz1==clazz3);//常见 方法

System.out.println("类的名字" +clazz1.getName());

System.out.println("类的简称" +clazz1.getSimpleName());

System.out.println("包的信息" +clazz1.getPackage().getName());

System.out.println("获取包名" +clazz1.getPackage());

System.out.println("获取修饰符" +clazz1.getModifiers());

System.out.println("获取父类" +clazz1.getSuperclass());

System.out.println("获取父类的超类" +clazz1.getGenericSuperclass());

System.out.println("判断是否为接口" +clazz1.isInterface());

System.out.println("获取类加载器" +clazz1.getClassLoader());//基本类型9=(8种基本数据类型的类+1void)

System.out.println(int.class == Integer.class);//不等//判断是否是基本类型

System.out.println(int.class.isPrimitive());

System.out.println(Integer.class.isPrimitive());

System.out.println("数组是引用类型" + int[].class.isPrimitive());

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

获取类的名字,方法,属性,构造器

importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest2 {public static voidmain(String[] args) {try{

Class clazz= Class.forName("bean.User");//获取类的名字

clazz.getName();/*** 获取属性信息*/

//只能获取public的属性

Field[] fields1 =clazz.getFields();//可以获得所有的属性

Field[] fields2 =clazz.getDeclaredFields();//输出获取到的属性的个数

System.out.println(fields1.length);

System.out.println(fields2.length);//遍历获取到的属性

for(Field field : fields2) {

System.out.println("属性" +field);

}//获得属性的权限

Field f = clazz.getDeclaredField("uname");

System.out.println(f);/*** 获取方法的信息*/Method[] methods=clazz.getDeclaredMethods();

Method m01= clazz.getDeclaredMethod("getUname", null);//如果方法有参,则必须传递参数类型对应的class对象

Method m02 = clazz.getDeclaredMethod("setUname", String.class);for(Method method : methods) {

System.out.println("方法" +method);

}/***获取构造器信息*/Constructor[] constructors=clazz.getDeclaredConstructors();

Constructor c= clazz.getDeclaredConstructor(int.class,int.class,String.class);

System.out.println("获得构造器"+c);for(Constructor constructor : constructors) {

System.out.println("构造器"+constructor);

}

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(NoSuchFieldException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(SecurityException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(NoSuchMethodException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

通过反射操作类的属性,方法构造器

importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importbean.User;/***@authorclc

**/

public classTest3 {public static voidmain(String[] args) {try{

Class clazz = (Class) Class.forName("bean.User");//通过反射API调用构造方法,构造对象//其实调用了User的无参构造方法

User u1 =clazz.newInstance();

System.out.println(u1);//有参调用构造器

Constructor c = clazz.getDeclaredConstructor(int.class, int.class, String.class);

User u2= c.newInstance(1234, 22, "clc");

System.out.println(u2);//通过反射调用普通方法

User u3 =clazz.newInstance();

Method method= clazz.getDeclaredMethod("setUname", String.class);//相当于u3.setUname("clc3");

method.invoke(u3, "clc3");

System.out.println(u3);//通过反射操作属性

User u4 =clazz.newInstance();

Field f= clazz.getDeclaredField("uname");//设置属性不需要安全检查,可以直接访问

f.setAccessible(true);//通过反射直接设置属性

f.set(u4, "clc4");//通过反射直接读取属性值

System.out.println(u4.getUname());

System.out.println(f.get(u4));

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(InstantiationException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IllegalAccessException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(NoSuchMethodException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(SecurityException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IllegalArgumentException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(InvocationTargetException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(NoSuchFieldException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

辅助类User

packagebean;public classUser {private intid;private intage;privateString uname;

@OverridepublicString toString() {return "User [id=" + id + ", age=" + age + ", uname=" + uname + "]";

}

@Overridepublic inthashCode() {final int prime = 31;int result = 1;

result= prime * result +age;

result= prime * result +id;

result= prime * result + ((uname == null) ? 0: uname.hashCode());returnresult;

}

@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (getClass() !=obj.getClass())return false;

User other=(User) obj;if (age !=other.age)return false;if (id !=other.id)return false;if (uname == null) {if (other.uname != null)return false;

}else if (!uname.equals(other.uname))return false;return true;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}publicString getUname() {returnuname;

}public voidsetUname(String uname) {this.uname =uname;

}public User(int id, intage, String uname) {super();this.id =id;this.age =age;this.uname =uname;

}publicUser() {super();

}

}

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import bean.User;

/**

*@authorclc

*

*/

public class Test3 {

public static void main(String[] args) {

try {

Class clazz = (Class) Class.forName("bean.User");

// 通过反射API调用构造方法,构造对象

// 其实调用了User的无参构造方法

User u1 = clazz.newInstance();

System.out.println(u1);

// 有参调用构造器

Constructor c = clazz.getDeclaredConstructor(int.class, int.class, String.class);

User u2 = c.newInstance(1234, 22, "clc");

System.out.println(u2);

// 通过反射调用普通方法

User u3 = clazz.newInstance();

Method method = clazz.getDeclaredMethod("setUname", String.class);

// 相当于u3.setUname("clc3");

method.invoke(u3, "clc3");

System.out.println(u3);

// 通过反射操作属性

User u4 = clazz.newInstance();

Field f = clazz.getDeclaredField("uname");

// 设置属性不需要安全检查,可以直接访问

f.setAccessible(true);

// 通过反射直接设置属性

f.set(u4, "clc4");

// 通过反射直接读取属性值

System.out.println(u4.getUname());

System.out.println(f.get(u4));

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值