黑马程序员------反射

反射机制
反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作。
主要运用Class、Constructor、Field、Method 四个类,其中Class代表类对象,Constructor代表构造器对象,
Field类代表属性对象,Method代表方法对象,通过这四个对象可以粗略得到某个类的组成部分。

实例化类对象:
1.Class.forName(包名.类名);
2.类名.class;
3.对象.getClass();
package cn.itcast;
public class A {
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
Class c1=A.class;
Class c2=new A().getClass();
System.out.println(c.getName()+"--"+c1.getName()+"--"+c2.getName());
}
}
Class主要是反射的源头,相当于拿到类的字节码文件,不光可以取得对象所在类的信息,也可以直接实例化对象。
package cn.itcast;
public class A {
private String name;
private int 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;
}
public String toString(){
return this.name+"--"+this.age;
}
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
A a=(A) c.newInstance();
a.setName("wangwu");
a.setAge(22);
System.out.println(a.toString());
}
}
可见,反射可以不用使用new也可以实例化对象,不过以上操作必须在A类中有无参的构造函数。
以下代码可实现即使没有无参构造函数也可以实例化对象:
package cn.itcast;
import java.lang.reflect.Constructor;
public class A {
private String name;
private int age;
public A(String name,int age){
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;
}
public String toString(){
return this.name+"--"+this.age;
}
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
Constructor[] cc=c.getConstructors();
A a=(A) cc[0].newInstance("lisi",23);
System.out.println(a.toString());
}
}
获取指定类的组织结构:
package cn.itcast;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class B implements ImpB{
private String name;
private int age;
public B(){};
public B(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return this.name+"--"+this.age;
}
@Override
public void dosomething() {
System.out.println("学习java");
}
public void play(){
System.out.println("打篮球");
}
public static void main(String[] args) throws Exception {
Class<?> c= Class.forName("cn.itcast.B");
Class[] in=c.getInterfaces();//获取所有实现的接口
for(int i=0;i<in.length;i++){
System.out.println(in[i].getName());
}
Class<?> su= c.getSuperclass();//获取继承的类
System.out.println(su.getName());
Constructor[] con=c.getConstructors();//获取所有的构造函数
for(int i=0;i<con.length;i++){
System.out.println(con[i]);
}
Method[] me=c.getDeclaredMethods();//获取本类所有方法
for(int i=0;i<me.length;i++){
System.out.println(me[i]);
}
Method[] met=c.getMethods();//获取所有方法
for(int i=0;i<met.length;i++){
System.out.println(met[i]);
}
Field[] fi=c.getDeclaredFields();//获取本类中的属性
for(int i=0;i<fi.length;i++){
System.out.println(fi[i]);
}
Field[] fie=c.getFields();//获取接口和父类的公共属性
for(int i=0;i<fie.length;i++){
System.out.println(fie[i]);
}
}
}
interface ImpB{
public abstract void dosomething();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值