Передать объект любого типа в класс B - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу иметь возможность передавать Object из любого класса в определенный класс.Как мне это сделать?Я передаю объект в конструктор получающего класса.Я знаю один обходной путь - использование статических переменных, но мне нужен весь объект, а не только переменные.

 public class tryitout
{
public static void main(String[] args) {        
    A a = new A();
    B b = new B(a);
    b.print();
}
}
class A implements Serializable
{
 public int a;
 public String b;

A()
{
    this.a = 12;
    this.b =" nach";
}
}

class B
{
  Object obj;
  B(Object o)
 {
  obj = o;
 }
void print()
{

    System.out.println(obj.a + " "+ obj.b);
}
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Использование обобщений:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class tryitout {
    public static void main(String[] args) {
        ClassA a = new ClassA("sap",11);
        ClassB<ClassA> b = new ClassB<ClassA>(a);
        b.print();
    }
}

public class ClassA {

    private String name;
    private int id;

    public ClassA(String name, int id) {
        super();
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return "ClassA [name=" + name + ", id=" + id + "]";
    }
}

public class ClassB<T> {

    private T genericObj;

    public ClassB(T genericObj){
        this.genericObj = genericObj;
    }

    public void print() {
        Field nameField = getField("name");
        Field idField = getField("id");
        try {
            System.out.println(nameField.get(genericObj));
            System.out.println(idField.getInt(genericObj));
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private Field getField(String FieldName) {
        Field fld = null;
        try {
            fld = genericObj.getClass().getDeclaredField(FieldName);
            if(Modifier.isPrivate(fld.getModifiers())) {
                fld.setAccessible(true);//To get access over private fields
            } 
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return fld;
    }
}

с использованием обобщений, вы также можете получить доступ к методу.Я не знаю вашей точной цели, иначе другие классы могут расширять любой конкретный абстрактный класс, и вы можете использовать этот абстрактный класс как тип внутри класса B.


public class TypeClass {
    protected String name;
    protected int id;

    protected void paint(){
        System.out.println("name: " + name + " | id: " + id);
    } 
}

public class ClassC extends TypeClass{
    public ClassC(String name, int id) {
        super();
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return "ClassA [name=" + name + ", id=" + id + "]";
    }
}

package javaConcept.generics;

public class ClassD {
  private TypeClass typeClass;
  public ClassD(TypeClass typeClass) {
      this.typeClass = typeClass;
  }

  public void newPaint() {
      typeClass.paint();
  }
}

public class TempoClass {
    public static void main(String[] args) {
        ClassC c = new ClassC("sap",11);
        ClassD b = new ClassD(c);
        b.newPaint();
    }
}
0 голосов
/ 28 сентября 2019

может использовать статические блоки и анонимные блоки, например:

public class HelloWorld{

     public static void main(String []args){
        B ob1= new B();
        C ob2= new C(B.ob);
    D ob3= new D();
        C ob4= new C(ob3.ob);
     }
}
class A
{
    //this is empty class just for sake of object to be created
    public void imWorking()
    {
        System.out.println("test");
    }
}
class B
{
    public static A ob;
    static{ob=new A();}//static called once class gets loaded
}

class C
{

    public C(){}//Default constructor
    public C(A a){a.imWorking();}
}
class D
{
    public A ob;
    {ob=new A();}//ananomous block calls everytime a new object is created
}

подробнее Статические блоки инициализации блоки и анонимные блоки] [1]

...