浅谈反射机制(一)

来源:互联网 发布:mysql如何开启事务 编辑:程序博客网 时间:2024/06/05 02:14

今天我来说一下在Java里面是反射机制。通俗的讲就是根据一个对象去找该对象所在的包和类。平常我们编写Java程序的时候都是创建一个类,然后再去new出该类的对象。而反射机制刚好是相反的。截图如下:

要学反射机制首先就要学好Object中的getClass()这个方法。首先先看一下jdk帮助文档里面的有关方法:


要注意到getClass()方法前面有一个final关键字,final关键字在这里的作用就是其他类去继承Object,但不能去重写getClass()方法

例如以下程序就用到了反射机制:

package com.cal.demo;

public class Demo{

public static void main(String[] args){

Student s = new Student();

System.out.println(s.getClass().getName());

}

}

class Student{}

结果是:com.cal.demo.Student

 


获取反射机制有三种方式:

例如一下代码:

package com.cal.demo;

public class Demo{

public static void main(String[] args){

Class<?> c1 = null;

Class<?> c2 = null;

Class<?> c3 = null;


try{

c1 = Class.forName("com.cal.demo.Student");

}catch(Exception){

e.printStackTrace();

}


c2 = new Student().getClass();//通过Object类中的方法实例化


c3 = Student.class;//通过类.class实例化


System.out.println(c1.getName());

System.out.println(c2.getName());

System.out.println(c2.getName());

}

}

class Student{}

这三种方式返回的结果都一样,都是:com.cal.demo.Student


通过无参构造方法实例化对象

package com.cal.demo;

public class instance{

public static void main(String[] args){

Class<?> c = null;

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}


Student s = new Student();

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}


s.setName("伍金凡");

s.setAge(10);

System.out.println(s);

}

}


class Student{

private String name;

private int  age;

public void setName(String name){

this.name=name;

}

public String getName(){

return name;

}

public void setAge(int age){

this.age=age;

}

public int getAge(){

return age;

}

public String toString(){

return "姓名:"+this.name+",年龄:"+this.age+"";

}

}


我来解释一下这里:

首先Student类,这里面就是两个属性,以及默认的无参构造函数,set和get方法

然后就是main里面的代码了。

Class<?> c = null;

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}


Student s = new Student();

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}


其实这些操作就是取代了之前的new关键字

Class<?> c = null;这是指定一个泛型

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}找到所在的类


Student s = new Student();//声明一个Student对象

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}实例化Student对象



通过有参构造方法实例化对象

package com.cal.demo;

public class Instance{

public static void main(String[] args){

Class<?> c =null;

try{

c = Class.forName(com.cal.demo.Student);

}catch(Exception e){

e,printStackTrace();

}


Student s=null;

Constructor<?> cons[] = null;

cons = c.getConstructors();

try{}catch(Exception e){

s = (Student)cons[0].newInstance("伍金凡",10);

}catch(Exception e){

e.printStackTrace();

}

System.out.println(s);

}

}


class Student{

private String name;

private int age;


public void setName(String name){

this.name=name;

}

public String getName(){

return name;

}

public void setAge(){

this.age=age;

}

public int getAge(){

return age;

}

public Student(String name,int age){

this.setName(name);

this.setAge(age);

}

public String toString(){

return "姓名:"+this.name+",年龄:"+this.age+"";

}

}


这里声明了一个构造方法的数组

并且cons = c.getConstructors();获取Student所有的构造方法。 

0 0